【发布时间】:2019-01-23 00:32:59
【问题描述】:
我有一个名为Cities 的表,如下所示:
+--------+-------------+-------+----------+------------+
| CityID | City | State | TimeZone | UserAccess |
+--------+-------------+-------+----------+------------+
| 1 | Albany | NY | 4 | 1 |
| 2 | Allentown | PA | 6 | 1 |
| 3 | Albuquerque | NM | 4 | 1 |
| 4 | Amarillo | TX | 3 | 1 |
| 5 | Atlanta | GA | 4 | 1 |
+--------+-------------+-------+----------+------------+
我有另一个名为 CitiesToRegions 的表,如下所示:
+--------+----------+
| CityID | RegionID |
+--------+----------+
| 1 | 14 |
| 1 | 15 |
| 2 | 14 |
| 3 | 11 |
| 4 | 12 |
| 4 | 13 |
| 5 | 12 |
| 5 | 13 |
+--------+----------+
我有一个Regions 表,如下所示:
+----------+-----------+--------+
| RegionID | Region | TypeID |
+----------+-----------+--------+
| 10 | West | 1 |
| 11 | West | 2 |
| 12 | South | 1 |
| 13 | South | 2 |
| 14 | Northeast | 1 |
| 15 | Northeast | 2 |
+----------+-----------+--------+
我要做的是编写一个查询,以便我可以根据Regions 表的TypeID 来查看我缺少CitiesToRegions 指定的位置。这是我到目前为止没有返回的内容,我敢肯定这是因为我的第一次加入没有发现空值,因为CityID 分配了RegionID。我只是不知道如何真正写出我要找的东西。
SELECT DISTINCT Cities.CityID
FROM Cities
INNER JOIN CitiesToRegions on Cities.CityID = CitiesToRegions.CityID
FULL JOIN Regions on CitiesToRegions.RegionID = Regions.RegionID
WHERE (CitiesToRegions.RegionID is null) AND (Cities.UserAccess=1) AND (Regions.TypeID != 1)
我希望看到的查询结果如下,因为它是唯一一个没有RegionID 的Regions.TypeID = 1 的CityID。
+--------+
| CityID |
+--------+
| 3 |
+--------+
注意:我不关心缺少 2 个的 TypeID,因为我会运行相同的查询并将 TypeID 作为变量传递:
【问题讨论】:
-
CitiesToRegions.RegionID 对于该数据和这些连接永远不会为空。 Cities 和 CitiesToRegions 之间的内部连接意味着所有这些都将匹配,并且与 Regions 的完全连接是毫无意义的,因为无论如何您都会匹配 Cities 值。我可能会使用
NOT EXISTS子句而不是加入。
标签: sql sql-server tsql sql-server-2008-r2