2012-04-30 82 views
1

我有一張名爲MapObjects的表格,用於存儲放置在地圖上的對象的信息。我有另一個名爲OrgLocations的表,用於存儲組織所在的所有位置。位置以經度和緯度定義。最後,我有另一個名爲ObjectLocations的表,它將地圖對象映射到OrgLocations表中的組織結構。它用於指示地圖上顯示的對象的位置子集。例如,假設一個組織(OrgID = 10)有4個位置(存儲在OrgLocations表中):達拉斯,亞特蘭大,邁阿密,紐約。 該組織有1個與亞特蘭大和邁阿密相關的地圖對象(MapObjects.ID = 5)。T-SQL:條件連接或複雜的WHERE子句?

我的數據集必須從OrgLocations返回與亞特蘭大和邁阿密相對應的記錄(但不包括達拉斯或紐約)。但是,我也可以有一個未分配給任何位置的地圖對象(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 ,ObjectLocations中存在2個位置:亞特蘭大和邁阿密。當MapObjects.ID爲6時,ObjectLocations中沒有記錄,因此將返回OrgLocatons中屬於組織的所有位置(OrgID = 11)。

感謝您的幫助!

回答

2

我想你會有最乾淨的查詢,如果你檢查存在MapObjectIDObjectLocations決定使用什麼查詢。

事情是這樣的:

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