根据第三个表中的值查找不存在的位置
Posted
技术标签:
【中文标题】根据第三个表中的值查找不存在的位置【英文标题】:Find where not exists, based on value from third table 【发布时间】: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
子句而不是加入。
【参考方案1】:
以下内容应该可以满足您的需要 - 我发现 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
)
【讨论】:
以上是关于根据第三个表中的值查找不存在的位置的主要内容,如果未能解决你的问题,请参考以下文章
mySQL 从一个表中选择,该表在另一个表中不存在,并且不是第三个表中的子表