テーブルの結合 (Add Join) (データ管理)

サマリー

共通フィールドに基づいて、レイヤーを別のレイヤーまたはテーブルに結合します。 ラスター属性テーブルを含むフィーチャ レイヤー、テーブル ビュー、およびラスター レイヤーを使用できます。

[結合テーブル] パラメーター値のレコードは、[入力テーブル] パラメーター値のレコードに一致します。 入力フィールドと結合フィールドの値が等しい場合に一致したと見なされます。 この結合は一時的なものです。

テーブルの結合ツールの図

使用法

  • [入力テーブル] パラメーター値は、属性テーブルを含むフィーチャ レイヤー、テーブル ビュー、またはラスター レイヤーにすることができます。 データ パスが使用されると、レイヤーが結合とともに作成されます。 結合は、データではなく常にレイヤーに格納されます。

  • 永続的な結合を作成するには、[フィールドの結合 (Join Field)] ツールを使用するか、結合したレイヤーを [フィーチャのコピー (Copy Features)][行のコピー (Copy Rows)][フィーチャのエクスポート (Export Features)]、または [テーブルのエクスポート (Export Table)] ツールのいずれかへの入力として使用します。 結果を新しいフィーチャクラスまたはテーブルに保存する場合、環境設定の完全に記述したフィールド名を保持を使用すると、結合後の出力フィールドの名前を、フィールドの取得元のテーブルの名前で修飾するかどうかを制御できます。 出力がシェープファイルの場合を除き、レイヤーから出力にフィールド エイリアスが保存されます。

  • [クエリ レイヤーの作成 (Make Query Layer)] ツール、[データベース ビューの作成 (Create Database View)] ツール、または [集約クエリ レイヤーの作成 (Make Aggregation Query Layer)] ツールを使用すると、結合パフォーマンスが最適化され、エンタープライズ ジオデータベースまたは SQLite データベース データを結合する際には、さらに多くの機能を使用できます。

  • 入力がフィーチャクラスまたはデータセット パスの場合、このツールは、ツールの結果が適用された新しいレイヤーを作成して返します。

  • 結合によって 1 対多の結合が生成された場合、結合の結果は属性テーブルで確認でき、テーブルに重複するオブジェクト ID が存在する場合、警告メッセージが表示されます。 多くのジオプロセシング ツールは重複したオブジェクト ID を含むデータをサポートしておらず、そのようなデータを処理した際に予期しない結果が生じる可能性があるため、最初に [フィーチャのエクスポート (Export Features)] ツールを使用して結合したレイヤーを新しいフィーチャクラスにコピーすることをお勧めします。 その後、新しいフィーチャクラスを他のジオプロセシング ツールの入力として使用します。

    必要に応じて、[結合方法] パラメーターを [1 対 1 の結合] に設定して、オブジェクト ID の重複を避けます。

  • [結合方法] パラメーターには、基数を調整するための状態が 3 つあります。 デフォルトは空白で、データ ソースが 1 対多の結合を試行できるようにします。 [1 対多の結合] オプションは、オブジェクト ID フィールドを持つ特定のデータ ソースでのみ動作します。 [1 対 1 の結合] オプションは、テーブルの最初の一致を使用します。その結果、オブジェクト ID フィールドが変更されるか、テーブルのコピー先のワークスペースが変更されると、出力が異なる可能性があります。 1 対 1 の結合は大文字と小文字を区別しませんが、1 対多の結合は大文字と小文字を区別します。

  • 次のテーブルには、さまざまな入力で結合を行った場合の考えられる結果が含まれます。

    最初のテーブルは、1 対多の結合を示します。 すべてのレコードが一致するため、一致するレコードのみを保持することによる影響はありません。

    入力テーブル結合テーブル結果

    入力フィールド

    タイプ

    結合フィールド

    入力フィールド

    タイプ

    結合フィールド

    1

    A

    1

    100

    1

    A

    1

    100

    2

    B

    2

    200

    2

    B

    2

    200

    1

    300

    1

    A

    1

    300

    2

    400

    2

    B

    2

    400

    テーブルの結合の例: 各テーブルにオブジェクト ID フィールドがあるときの 1 対多の結合

    2 番目のテーブルは、オブジェクト ID フィールドのない結合テーブルを使用しています。この場合、1 対 1 の結合のみが可能です。 また、各テーブルの取得元のワークスペースが異なる場合にのみ、1 対 1 の結合を行うことができます。 1 対 1 の結合は大文字と小文字が区別されません。

    入力テーブル結合テーブル結果

    入力フィールド

    タイプ

    結合フィールド

    入力フィールド

    タイプ

    結合フィールド

    1

    A

    1

    100

    1

    A

    1

    100

    2

    B

    2

    200

    2

    B

    2

    200

    3

    300

    4

    400

    テーブルの結合の例: いずれのテーブルもオブジェクト ID フィールドがないときの 1 対 1 の結合

    最後のテーブルで、入力テーブルには結合テーブルより多くのレコードがあります。 すべてのレコードを保持することにより、一致するすべてのレコードと一致しない入力テーブルのレコードが保持されます。

    入力テーブル結合テーブル結果

    入力フィールド

    タイプ

    結合フィールド

    入力フィールド

    タイプ

    結合フィールド

    1

    A

    1

    100

    1

    A

    1

    100

    2

    B

    2

    200

    2

    B

    2

    200

    3

    C

    1

    300

    1

    A

    1

    300

    4

    D

    2

    400

    2

    B

    2

    400

    3

    C

    <NULL>

    <NULL>

    4

    D

    <NULL>

    <NULL>

    テーブルの結合の例: 各テーブルにオブジェクト ID フィールドがあり、[すべての入力レコードを保持] パラメーターがオンのときの 1 対多の結合

    入力テーブルに、1 対多の結合を実行するオブジェクト ID フィールドがあり、同じワークスペースに存在する必要があります。

  • 結合テーブルのレコードは、結合テーブルがオブジェクト ID フィールドを含む場合は複数のレコードに一致することが可能です。そうでない場合は、1 対 1 の結合が実行されます。

  • テーブルを結合するときに、すべてのレコードを保持するのがデフォルトのオプションです。 入力テーブルのレコードと一致するレコードが結合テーブルに存在しない場合、そのレコードの、結合テーブルから入力テーブルに追加されているすべてのフィールドに、NULL 値が与えられます。

    入力テーブル結合テーブル結果

    入力フィールド

    タイプ

    結合フィールド

    入力フィールド

    タイプ

    結合フィールド

    1

    A

    1

    100

    1

    A

    1

    100

    2

    B

    2

    200

    2

    B

    2

    200

    3

    C

    1

    300

    1

    A

    1

    300

    4

    D

    2

    400

    2

    B

    2

    400

    3

    C

    <NULL>

    <NULL>

    4

    D

    <NULL>

    <NULL>

    [すべての入力レコードを保持] パラメーターがオフのとき、入力テーブルのレコードと一致するレコードが結合テーブルに存在しない場合、結合後の出力からそのレコードが削除されます。 入力テーブルがレイヤーの属性テーブルである場合、それらに結合されているデータを持たないフィーチャはマップに表示されません。

    入力テーブル結合テーブル結果

    入力フィールド

    タイプ

    結合フィールド

    入力フィールド

    タイプ

    結合フィールド

    1

    A

    1

    100

    1

    A

    1

    100

    2

    B

    2

    200

    2

    B

    2

    200

    3

    300

    4

    400

  • [フィールド演算 (Calculate Field)] ツールは、1 対多のレイヤーを使用している場合は最初に見つかったレコードを更新し、残りの重複レコードをスキップします。 テーブル ビューで結合レイヤー フィールド値を手動で編集すると、最後に行った編集内容が残ります。

  • エイリアス、表示設定、数値形式などのフィールド プロパティは、結合が追加または削除された場合も維持されます。

  • 結合はレイヤーの継続期間のみ有効です。 レイヤーは、ArcGIS AllSource セッションを保存するか、[レイヤーをファイルへ保存 (Save Layer To File)] ツールを使用してレイヤー ファイルに保存することで、保持できます。

    スクリプト ツールで作成された結合の結果を確認するには、ツールがレイヤーを派生した出力パラメーターとして含む必要があります。 同様に、結合された結果を確認するには、モデル ツールで、[更新された入力レイヤーまたはテーブル ビュー] パラメーターを派生した出力パラメーターとして設定する必要があります。

  • デフォルトとして、ツール実行後のテーブルでは、フィールドの前に入力の名前とピリオド (.) が追加され、結合テーブルのすべてのフィールドの前に結合テーブルの名前とピリオドが追加されます。

    たとえば、AB というフィールドがある landuse を、CD というフィールドがある lookup_tab に結合すると、ツール実行後のレイヤーまたはテーブル ビューのフィールドは landuse.Alanduse.Blookup_tab.Clookup_tab.D になります。

  • レイヤーには一意のフィールド名が必要です。 入力テーブルと結合テーブルの名前が同じで異なるワークスペースに存在する場合、結合を実行すると定義が不適切なレイヤーが作成されます。

  • 入力フィールドと結合フィールドにインデックスを付けると、パフォーマンスが向上します。 [結合フィールドのインデックスを作成] パラメーターをオンにすると、両方のフィールドに属性インデックスが追加されます。 または、結合する各フィールドには、[属性インデックスの追加 (Add Attribute Index)] ツールを使用してインデックスを付けることができます。

  • 結合結果が想定外または未完了の場合は、入力フィールドと結合フィールドにインデックスが付けられているかどうかを確認します。 フィールドにインデックスがない場合は、インデックスを追加してみてください。 フィールドにインデックスがある場合は、インデックスを削除して再度追加し、インデックスに関する問題を修正してください。 あるいは、[インデックスの再構築 (Rebuild Indexes)] パラメーターをオンにし、既存のインデックスを削除して再構築します。

  • 入力のレイヤーまたはテーブル ビューのフィールドが [フィーチャ レイヤーの作成 (Make Feature Layer)] ツールまたは [テーブル ビューの作成 (Make Table View)] ツールの [フィールド情報] パラメーターを使用して変更 (名前の変更または非表示設定) された場合でも、このフィールド変更は、結合後の出力のレイヤーまたはテーブル ビューには含まれません。

  • 結合テーブルの定義クエリは、新しいアクティブなクエリを追加することで入力レイヤーまたはテーブル ビューに適用されます。 前回のクエリは保持され非アクティブに設定されるため、必要に応じて結合されたテーブルから無効にすることができます。 定義クエリを削除するには、[テーブル結合の解除 (Remove Join)] ツールを使用します。

  • 結合テーブルに定義クエリがある場合、[すべての入力レコードを保持] パラメーターによる影響はありません。 必要に応じて、or OBJECTID is null を追加し、定義クエリを手動で更新して修正できます。

  • [結合の検証 (Validate Join)] ツールを使用すると、レイヤーまたはテーブルに有効なフィールド名および Object ID フィールドがあるかどうか、結合によって一致するレコードが生成されるか、結合が 1 対 1 であるか 1 対多であるかなどの結合のプロパティを判定するため、2 つのレイヤーまたはテーブル間の結合について検証を行うことができます。

    結合の検証を行うボタンは、簡単に使用できるよう、ツールのダイアログ ボックスにあります。

  • [テーブルの結合 (Add Join)] ツールでは、入力テーブルまたは結合テーブルの選択セットは無視されます。 [フィールドの結合 (Join Field)] ツールでは、選択セットがサポートされています。 選択したサブセットのみで結合するには、選択レイヤーを作成して、そのレイヤーを [テーブルの結合 (Add Join)] ツールの入力として使用します。 結合レイヤーのプロパティは、選択レイヤーの作成時にコピーされます。

パラメーター

ラベル説明データ タイプ
入力テーブル

結合テーブルに結合するレイヤーまたはテーブル ビュー。

Mosaic Layer; Raster Layer; Table View
入力フィールド

結合のキーとなる、入力のレイヤーまたはテーブル ビューのフィールド。

Field
結合テーブル

入力レイヤーまたはテーブル ビューに結合されるテーブルまたはテーブル ビュー。

Mosaic Layer; Raster Layer; Table View
結合フィールド

結合のキーとなる値が格納されている、結合テーブル内のフィールド。

Field
すべての入力レコードを保持
(オプション)

結合先のテーブルに含まれるレコードに一致する入力内のレコードのみを出力に含めます。

  • オン - 入力のレイヤーまたはテーブル ビュー内のすべてのレコードを出力に含めます。 これは外部結合とも呼ばれます。 これがデフォルトです。
  • オフ - 結合先のテーブルに含まれる行に一致する入力内のレコードのみを出力に含めます。 これは内部結合とも呼ばれます。
Boolean
インデックス結合フィールド
(オプション)

入力フィールドおよび結合フィールドに、テーブル属性インデックスの追加を行うかどうかを指定します。

  • オン - 両方のフィールドにインデックスが作成されます。 テーブルに既存のインデックスが存在する場合、新しいインデックスは追加されません。
  • オフ - インデックスは追加されません。 これがデフォルトです。
Boolean
結合フィールドのインデックスの再構築
(オプション)

入力フィールドと結合フィールドのインデックスを削除して再構築するかどうかを指定します。

  • オン - 既存のインデックスが削除され、新しいインデックスが追加されます。
  • オフ - 既存のインデックスの削除および再構築を行いません。 これがデフォルトです。
Boolean
結合方法
(オプション)

データに 1 対多の基数が含まれている場合に、結合が 1 対多または 1 対 1 のいずれであるかを指定します。

パラメーター値が指定されない場合は、結合方法はデータ ソースに基づきます。

  • 1 対 1 の結合結合方法では、最初の一致が使用されます。
  • 1 対多の結合結合方法では、大文字と小文字を区別する複数の一致が実行されます。
String

派生した出力

ラベル説明データ タイプ
更新された入力レイヤーまたはテーブル ビュー

更新された入力データセット。

Table View; Raster Layer; Mosaic Layer

arcpy.management.AddJoin(in_layer_or_view, in_field, join_table, join_field, {join_type}, {index_join_fields}, {rebuild_index}, {join_operation})
名前説明データ タイプ
in_layer_or_view

結合テーブルに結合するレイヤーまたはテーブル ビュー。

Mosaic Layer; Raster Layer; Table View
in_field

結合のキーとなる、入力のレイヤーまたはテーブル ビューのフィールド。

Field
join_table

入力レイヤーまたはテーブル ビューに結合されるテーブルまたはテーブル ビュー。

Mosaic Layer; Raster Layer; Table View
join_field

結合のキーとなる値が格納されている、結合テーブル内のフィールド。

Field
join_type
(オプション)

結合先のテーブルに含まれるレコードに一致する入力内のレコードのみを出力に含めます。

  • KEEP_ALL入力のレイヤーまたはテーブル ビュー内のすべてのレコードを出力に含めます。 これは外部結合とも呼ばれます。 これがデフォルトです。
  • KEEP_COMMON結合先のテーブルに含まれる行に一致する入力内のレコードのみを出力に含めます。 これは内部結合とも呼ばれます。
Boolean
index_join_fields
(オプション)

入力フィールドおよび結合フィールドに、テーブル属性インデックスの追加を行うかどうかを指定します。

  • INDEX_JOIN_FIELDS両方のフィールドにインデックスが作成されます。 テーブルに既存のインデックスが存在する場合、新しいインデックスは追加されません。
  • NO_INDEX_JOIN_FIELDSインデックスは追加されません。 これがデフォルトです。
Boolean
rebuild_index
(オプション)

入力フィールドと結合フィールドのインデックスを削除して再構築するかどうかを指定します。

  • REBUILD_INDEX既存のインデックスが削除され、新しいインデックスが追加されます。
  • NO_REBUILD_INDEX既存のインデックスの削除および再構築を行いません。 これがデフォルトです。
Boolean
join_operation
(オプション)

データに 1 対多の基数が含まれている場合に、結合が 1 対多または 1 対 1 のいずれであるかを指定します。

パラメーター値が指定されない場合は、結合方法はデータ ソースに基づきます。

  • JOIN_ONE_TO_FIRST結合方法では、最初の一致が使用されます。
  • JOIN_ONE_TO_MANY結合方法では、大文字と小文字を区別する複数の一致が実行されます。
String

派生した出力

名前説明データ タイプ
out_layer_or_view

更新された入力データセット。

Table View; Raster Layer; Mosaic Layer

コードのサンプル

AddJoin の例 1 (Python ウィンドウ)

次の Python ウィンドウ スクリプトは、イミディエイト モードで AddJoin 関数を使用する方法を示しています。

import arcpy
arcpy.env.workspace = "C:/data/Habitat_Analysis.gdb"
veg_joined_table = arcpy.management.AddJoin("vegetation", "HOLLAND95", 
                                            "vegtable", "HOLLAND95")
arcpy.management.CopyFeatures(veg_joined_table, "vegjoin")
AddJoin の例 2 (スタンドアロン スクリプト)

次のスタンドアロン スクリプトは、AddJoin 関数をワークフローの一部として使用し、テーブルをフィーチャクラスに結合してから指定したフィーチャを抽出する方法を示しています。

# Name: AttributeSelection.py
# Purpose: Join a table to a feature class and select the desired attributes

# Import system modules
import arcpy

# Set environment settings
arcpy.env.workspace = "C:/data/Habitat_Analysis.gdb"
# The qualifiedFieldNames environment is used by Copy Features when persisting 
# the join field names.
arcpy.env.qualifiedFieldNames = False

# Set local variables
inFeatures = "vegtype"
joinTable = "vegtable"
joinField = "HOLLAND95"
expression = "vegtable.HABITAT = 1"
outFeature = "vegjoin"

# Join the feature layer to a table
veg_joined_table = arcpy.management.AddJoin(inFeatures, joinField, joinTable, 
                                            joinField)

# Select desired features from veg_layer
arcpy.management.SelectLayerByAttribute(veg_joined_table, "NEW_SELECTION", 
                                        expression)

# Copy the layer to a new permanent feature class
result = arcpy.management.CopyFeatures(veg_joined_table, outFeature)

# See field names and aliases
resultFields = arcpy.ListFields(result)
print([field.name for field in resultFields])
print([field.aliasName for field in resultFields])

関連トピック