テーブル結合


ArcGIS テーブル結合と実際流れるクエリまとめ@10.0
要は[全てのレコードを保持する]チェックは使わない方がよさそうと言う話
あとはIQueryDefで結合可能と言うおまけ。

まあ、最近はクエリレイヤとかWKBからジオメトリ生成する手段があるので使わないで済む事が多い気がするが。
詳細は下記

[全てのレコードを保持する]テーブル結合でかつ結合先テーブルにレンダリング属性を持つ場合のクエリ
クエリが二重に流れかつアプリケーション側で結合されるよう (何故かFULL OUTERですらない)

select
  JCODE,  OBJECTID,  KEN  
from
  DB名.スキーマ名.ATTR_TABLE  
where 
  (JCODE in (列挙))

SELECT
  JCODE,  OBJECTID,  Shape  
FROM 
  DB名.スキーマ名.SHAPE_TABLE
WHERE
  空間条件

[ 一致するレコード]にチェックを入れた場合の挙動
まあインデックス次第では性能問題少なそう

SELECT
  DB名.スキーマ名.SHAPE_TABLE.Shape,
  DB名.スキーマ名.ATTR_TABLE.KEN
FROM 
  DB名.スキーマ名.SHAPE_TABLE,DB名.スキーマ名.ATTR_TABLE
WHERE
  空間条件 AND  (DB名.スキーマ名.SHAPE_TABLE.JCODE = DB名.スキーマ名.ATTR_TABLE.JCODE)

ArcObjects これ以外の引っ張り方する場合はどうなるのだろう

using (ComReleaser com = new ComReleaser())
{
    string connectionString = "SERVER=DUMMY;DATABASE=DB名;INSTANCE=sde:sqlserver:ホスト名;USER=ユーザ;PASSWORD=パスワード;VERSION=dbo.DEFAULT";

    Type t = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory");
    IWorkspaceFactory2 wsf = (IWorkspaceFactory2)Activator.CreateInstance(t);
    com.ManageLifetime(wsf);

    IFeatureWorkspace fw = (IFeatureWorkspace)wsf.OpenFromString(connectionString, 0);
    com.ManageLifetime(fw);

    IQueryDef queryDef = fw.CreateQueryDef();
    com.ManageLifetime(queryDef);
    //JPN71 JPN71PT
    queryDef.Tables = "SHAPE_TABLE,ATTR_TABLE";
    queryDef.SubFields = "ATTR_TABLE.*,SHAPE_TABLE.ObjectID OID,SHAPE_TABLE.Shape";
    queryDef.WhereClause = "ATTR_TABLE.JCODE = SHAPE_TABLE.JCODE";

    //IFeatureDataset fd = fw.OpenFeatureQuery("TEST", queryDef);
    //com.ManageLifetime(fd);

    //IFeatureClassContainer fcContainer = (IFeatureClassContainer)fd;
    //IFeatureClass fc = fcContainer.get_ClassByName("TEST");
    //com.ManageLifetime(fc);

    //Console.WriteLine(fc.AliasName);
    //for (int i = 0; i < fc.Fields.FieldCount; i++)
    //{
    //    IField f = fc.Fields.get_Field(i);
    //    com.ManageLifetime(f);

    //    Console.WriteLine( "  " + f.Name + ","  + f.Type.ToString("G"));
    //}
    ICursor cursor = queryDef.Evaluate();//fc.Search(null, true);
    com.ManageLifetime(cursor);

    IRow feature = null;
    while ((feature = cursor.NextRow()) != null)
    {
      //...処理
    }
}

上記で下記

select
  ATTR_TABLE.OBJECTID,
  ATTR_TABLE.JCODE,
  ATTR_TABLE.KEN,
  ATTR_TABLE.SICHO,
  ATTR_TABLE.GUN,
  ATTR_TABLE.SEIREI,
  ATTR_TABLE.SIKUCHOSON,
  ATTR_TABLE.CITY_ENG,
  ATTR_TABLE.P_NUM,
  ATTR_TABLE.H_NUM,
  ATTR_TABLE.Shape_area,
  ATTR_TABLE.Shape_len,
  SHAPE_TABLE.ObjectID OID,
  SHAPE_TABLE.Shape,
from
  SHAPE_TABLE  
LEFT JOIN
 ATTR_TABLE  
where
 (ATTR_TABLE.JCODE = SHAPE_TABLE.JCODE)
カテゴリー: 開発, 設計 タグ: , , パーマリンク