2012-04-30 7 views
1

マップに配置されたオブジェクトに関する情報を格納するために使用されるMapObjectsというテーブルがあります。組織があるすべての場所を格納するために使用されるOrgLocationsという別のテーブルがあります。場所は緯度と経度で定義されています。最後に、MapオブジェクトをOrgLocationsテーブルの有機体にマップするObjectLocationsという別のテーブルがあります。マップ上に表示されるオブジェクトの場所のサブセットを示すために使用されます。T-SQL:条件付き結合または畳み込みWHERE節?

組織(OrgID = 10)に4つの場所(OrgLocationsテーブルに格納されている)があるとします。Dallas、Atlanta、Miami、New York。 組織にはAtlantaとMiami(MapObjects.ID = 5)に関連付けられた1つのマップオブジェクトがあります。

私のデータセットは、AtlantaとMiamiに対応するOrgLocationsのレコードを返す必要があります(DallasまたはNew Yorkは含まれません)。しかし、私は任意の場所(ObjectLocationsのレコードなし)に割り当てられていないマップオブジェクトを持つこともできます。これらのマップオブジェクトは依然として組織に属していますが、特定の場所には関連付けられていません。この場合、私は組織に割り当てられたすべての場所を返すことにします。

これが条件付き結合またはWHERE句の中で実行されるかどうかはわかりません。ここにテーブルがいくつかのデータをどのように見えるかです:

OrgLocations

ID OrgID  Latitude  Longitude  Name 
0  10  32.780  -96.798  Dallas 
1  10  33.7497  -84.394  Atlanta 
2  10  25.7863  -80.2270  Miami 
3  10  40.712  -74.005  New York 
4  11  42.348  -83.071  Detroit 

ObjectLocations

OrgLocationID  MapObjectID 
1      5 
2      5 

この例ではMapObjectsの

ID  OrgID 
5  10 
6  11 

、MapObjects.IDは5でありますこのオブジェクトの2つの場所がObjectLocations:AtlantaとMiamiに存在します。 MapObjects.IDが6の場合、ObjectLocationsにレコードが存在しないため、組織に属するOrgLocatonsのすべての場所(OrgID = 11)が返されます。

ありがとうございました!

答えて

2

MapObjectIDの存在を確認して、使用するクエリを決定する場合は、ObjectLocationsで最もクリーンなクエリがあると思います。このような

何か:単一のクエリとして

declare @MapObjectID int 
set @MapObjectID = 5 

if exists(select * 
      from ObjectLocations 
      where MapObjectID = @MapObjectID) 
begin 
    select * 
    from OrgLocations 
    where ID in (select OrgLocationID 
       from ObjectLocations 
       where MapObjectID = @MapObjectID) 
end 
else 
begin 
    select * 
    from OrgLocations 
    where OrgID in (select OrgID 
        from MapObjects 
        where ID = @MapObjectID) 
end 

select OL.* 
from OrgLocations as OL 
    inner join ObjectLocations as OLoc 
    on OL.ID = OLoc.OrgLocationID 
where OLoc.MapObjectID = @MapObjectID 
union all 
select OL.* 
from OrgLocations as OL 
    inner join MapObjects as MO 
    on OL.OrgID = MO.OrgID 
where MO.ID = @MapObjectID and 
     not exists (select * 
        from ObjectLocations 
        where MapObjectID = @MapObjectID) 
+2

+1あなたはいくつかの結合を行うことができますが、そのクエリは動作します:) –

+0

@aF「where ... in」結合を参照していると思います。私は、関係するテーブルのプライマリ・キー/ユニーク制約を知らなくても、ジョインを使って少し安全ではないと感じました。この方法では、出力に重複する場所はありません。 –

+0

実際には、結果セットをサブクエリとして含める必要があるため、If ... elseは機能しません。 – AndroidDev