根据第三张表中的值查找不存在的地方

时间:2019-01-23 00:32:59

标签: sql sql-server tsql sql-server-2008-r2

我有一个名为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)

我想查询的结果如下,因为它是唯一一个没有Regions.Region.TypeID = 1的CityID。

+--------+
| CityID |
+--------+
|      3 |
+--------+

注意:我不担心看到缺少2的TypeID,因为我会运行相同的查询并将TypeID作为变量传递:

1 个答案:

答案 0 :(得分:3)

以下内容将满足您的需要-我发现更容易通过not exists子查询来获得正确的逻辑,然后再进行复杂的联接。

select *
from Cities C
where not exists (
  select 1
  from CitiesToRegions CR
  inner join Regions R on CR.RegionID = R.RegionID and R.TypeID = 1
  where CR.CityID = C.CityID
)
相关问题