T-SQL:条件连接或复杂的WHERE子句?

时间:2012-04-30 07:51:19

标签: tsql join

我有一个名为MapObjects的表,用于存储放置在地图上的对象的信息。我有另一个名为OrgLocations的表,用于存储组织所在的所有位置。位置定义为纬度和经度。最后,我有另一个名为ObjectLocations的表,它将地图对象映射到OrgLocations表中的组织。它用于指示地图上显示的对象的位置子集。

例如,假设一个组织(OrgID = 10)有4个位置(存储在OrgLocations表中):Dallas,Atlanta,Miami,New York。 该组织有1个与亚特兰大和迈阿密相关联的地图对象(MapObjects.ID = 5)。

我的数据集必须返回与亚特兰大和迈阿密相对应的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个此对象的位置:Atlanta和Miami。当MapObjects.ID为6时,ObjectLocations中没有记录,因此返回OrgLocatons中属于该组织的所有位置(OrgID = 11)。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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)