Sql 根据第三个表中的值查找不存在的位置
我有一个名为Sql 根据第三个表中的值查找不存在的位置,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我有一个名为Cities的表,如下所示: +--------+-------------+-------+----------+------------+ | CityID | City | State | TimeZone | UserAccess | +--------+-------------+-------+----------+------------+ | 1 | Albany | NY | 4 | 1 | |
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 |
+--------+-------------+-------+----------+------------+
+--------+----------+
| CityID | RegionID |
+--------+----------+
| 1 | 14 |
| 1 | 15 |
| 2 | 14 |
| 3 | 11 |
| 4 | 12 |
| 4 | 13 |
| 5 | 12 |
| 5 | 13 |
+--------+----------+
+----------+-----------+--------+
| RegionID | Region | TypeID |
+----------+-----------+--------+
| 10 | West | 1 |
| 11 | West | 2 |
| 12 | South | 1 |
| 13 | South | 2 |
| 14 | Northeast | 1 |
| 15 | Northeast | 2 |
+----------+-----------+--------+
我有另一个名为CitiesToRegions
的表,如下所示:
+--------+-------------+-------+----------+------------+
| 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 |
+--------+-------------+-------+----------+------------+
+--------+----------+
| CityID | RegionID |
+--------+----------+
| 1 | 14 |
| 1 | 15 |
| 2 | 14 |
| 3 | 11 |
| 4 | 12 |
| 4 | 13 |
| 5 | 12 |
| 5 | 13 |
+--------+----------+
+----------+-----------+--------+
| RegionID | Region | TypeID |
+----------+-----------+--------+
| 10 | West | 1 |
| 11 | West | 2 |
| 12 | South | 1 |
| 13 | South | 2 |
| 14 | Northeast | 1 |
| 15 | Northeast | 2 |
+----------+-----------+--------+
我有一个区域
表,如下所示:
+--------+-------------+-------+----------+------------+
| 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 |
+--------+-------------+-------+----------+------------+
+--------+----------+
| CityID | RegionID |
+--------+----------+
| 1 | 14 |
| 1 | 15 |
| 2 | 14 |
| 3 | 11 |
| 4 | 12 |
| 4 | 13 |
| 5 | 12 |
| 5 | 13 |
+--------+----------+
+----------+-----------+--------+
| RegionID | Region | TypeID |
+----------+-----------+--------+
| 10 | West | 1 |
| 11 | West | 2 |
| 12 | South | 1 |
| 13 | South | 2 |
| 14 | Northeast | 1 |
| 15 | Northeast | 2 |
+----------+-----------+--------+
我试图做的是编写一个查询,以便根据Regions
表的TypeID
查看缺少CitiesToRegions
指定的位置。到目前为止,我得到的结果是什么都不返回,我确信这是因为我的第一个join没有找到空值,因为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的城市ID
+--------+
| CityID |
+--------+
| 3 |
+--------+
注意:我不想看到2中缺少的TypeID
,因为我会运行相同的查询,并将TypeID
作为变量传入:以下内容应该满足您的需要-我发现不存在
子查询更清楚地获得正确的逻辑,然后是复杂的连接
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
)
CitiesToRegions.RegionID对于该数据和这些联接永远不会为空。Cities和CitiesToRegions之间的内部连接意味着所有这些都将匹配,而与Regions的完全连接是毫无意义的,因为您仍然需要匹配Cities值。我可能会使用notexists
子句而不是join。