根据第三个表中的值查找不存在的位置

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)

我希望看到的查询结果如下,因为它是唯一一个没有RegionIDRegions.TypeID = 1CityID

+--------+
| 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
)

【讨论】:

以上是关于根据第三个表中的值查找不存在的位置的主要内容,如果未能解决你的问题,请参考以下文章

根据不存在/不存在的 ID 查找记录

mySQL 从一个表中选择,该表在另一个表中不存在,并且不是第三个表中的子表

HIVE:如何仅从两个表中的两列中选择第三个表中不存在的不同值?

在一个表中查找不存在于另一个表中的ID

HQL 左外连接用于查找一个表中存在而其他表中不存在的记录

excel中判断一个表中的某一列的数据在另一个表中的某一列中是不是存在