首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL:条件连接还是复杂的WHERE子句?

T-SQL:条件连接还是复杂的WHERE子句?
EN

Stack Overflow用户
提问于 2012-04-30 15:51:19
回答 1查看 466关注 0票数 1

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

例如,假设一个组织(OrgID = 10)有4个位置(存储在OrgLocations表中):达拉斯、亚特兰大、迈阿密、纽约。该组织有一个与亚特兰大和迈阿密相关的地图对象(MapObjects.ID = 5)。

我的数据集必须从OrgLocations返回对应于亚特兰大和迈阿密(但不包括达拉斯或纽约)的记录。但是,我也可以拥有一个没有分配给任何位置的地图对象(ObjectLocations中没有记录)。这些地图对象仍然属于某个组织,但不与任何特定位置相关联。在这种情况下,我想返回分配给组织的所有位置。

我不确定这是通过条件连接完成的,还是通过WHERE子句中的其他东西完成的。下面是包含一些数据的表的外观:

OrgLocations

代码语言:javascript
复制
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

代码语言:javascript
复制
OrgLocationID      MapObjectID
1                      5
2                      5

MapObjects

代码语言:javascript
复制
ID      OrgID
5        10
6        11

在此示例中,当MapObjects.ID为5时,ObjectLocations中存在此对象的两个位置:亚特兰大和迈阿密。当MapObjects.ID为6时,ObjectLocations中没有记录,因此将返回OrgLocatons中属于该组织的所有位置(OrgID = 11)。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-30 16:13:52

我猜,如果您检查ObjectLocations中是否存在MapObjectID来决定使用哪个查询,那么您将拥有最干净的查询。

如下所示:

代码语言:javascript
复制
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

作为单个查询。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10380230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档