我有一个名为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作为变量传递:
答案 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
)