1

マップ上に配置されたオブジェクトに関する情報を格納するために使用される MapObjects というテーブルがあります。組織が配置されているすべての場所を格納するために使用される OrgLocations という別のテーブルがあります。場所は緯度と経度で定義されます。最後に、マップ オブジェクトを OrgLocations テーブルの組織にマップする ObjectLocations という別のテーブルがあります。マップ上に表示されるオブジェクトの場所のサブセットを示すために使用されます。

たとえば、組織 (OrgID = 10) に、ダラス、アトランタ、マイアミ、ニューヨークの 4 つの場所 (OrgLocations テーブルに格納されている) があるとします。この組織には、アトランタとマイアミに関連付けられた 1 つのマップ オブジェクトがあります (MapObjects.ID = 5)。

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

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

組織の場所

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

オブジェクトの場所

OrgLocationID      MapObjectID
1                      5
2                      5

MapObject

ID      OrgID
5        10
6        11

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

助けてくれてありがとう!

4

1 に答える 1

2

MapObjectIDin の存在を確認して使用するクエリを決定すると、最もクリーンなクエリが得られると思います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)
于 2012-04-30T08:13:52.127 に答える