我有一个名为MapObjects的表,用于存储有关放置在地图上的对象的信息。我有另一个名为OrgLocations的表,用于存储组织所在的所有位置。位置用纬度和经度定义。最后,我有另一个名为ObjectLocations的表,它将地图对象映射到OrgLocations表中的组织。它用于指示地图上显示的对象的位置子集。
例如,假设一个组织(OrgID = 10)有4个位置(存储在OrgLocations表中):达拉斯、亚特兰大、迈阿密、纽约。该组织有一个与亚特兰大和迈阿密相关的地图对象(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 DetroitObjectLocations
OrgLocationID MapObjectID
1 5
2 5MapObjects
ID OrgID
5 10
6 11在此示例中,当MapObjects.ID为5时,ObjectLocations中存在此对象的两个位置:亚特兰大和迈阿密。当MapObjects.ID为6时,ObjectLocations中没有记录,因此将返回OrgLocatons中属于该组织的所有位置(OrgID = 11)。
谢谢你的帮助!
发布于 2012-04-30 16:13:52
我猜,如果您检查ObjectLocations中是否存在MapObjectID来决定使用哪个查询,那么您将拥有最干净的查询。
如下所示:
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)https://stackoverflow.com/questions/10380230
复制相似问题