2 个表的复杂连接

Posted

技术标签:

【中文标题】2 个表的复杂连接【英文标题】:Complex Join on 2 Tables 【发布时间】:2020-03-27 22:21:53 【问题描述】:

我有一个像这样的 ZIP 邻里表 -

ZIP     NEIGHBOR
------- --------
01026   01330   
01026   01331   
01026   01332   
01026   01333  
01026   01026
.............  

同一个 ZIP 可以有多个条目 - 每个条目都有一个邻居。 (ZIP 是它自己的邻居)

我有另一张表,其中包含有关哪些邮政编码没有该地区任何面包店的信息,

ZIP  
-----
01026  
01330 
01331
01332
01333
.....

因此,我们需要找到附近没有面包店的邮政编码。

我们怎么做?

在这种情况下,我们需要输出为 '01026' - 因为它本身和它的邻居都没有面包店

【问题讨论】:

嗨,你有没有尝试过?看起来一点也不复杂…… 你运行的是mysql还是db2?请仅使用相关标签。 您对此样本数据的预期输出是什么? 01026 在 NEIGHBOR 中,就像在 zip 中一样,您的问题没有任何意义 【参考方案1】:

我知道您想要第一个表中的zips(例如zip_neighborhood),其所有neighbors 都可以在另一个表中找到(例如zip_without_bakery)。

如果是这样,您可以left join 第二个表group by 压缩,并使用having clause 确保找到所有邻居。

select n.zip
from zip_neighborhood n
left join zip_without_bakery b on b.zip = n.neighbor
group by n.zip
having max(b.zip is null) = 0

【讨论】:

@elysian_seikatsu:我认为这应该可以满足您的需求。我也为答案添加了更多解释。【参考方案2】:

希望我理解正确,您只是想从 Table1 中过滤 Table2(仅限 ZIP)并排除所有条目?如果该表仍应显示面包店,则加入它们并使用 WHERE NOT 条件。

SELECT * 
FROM bakerytable, ziponlytable
WHERE NOT bakerytable.zip = ziponlytable.zip

调用隐式加入。我第一次看到它就喜欢它。

从两个表中选择每一列,并查找该条件。

【讨论】:

以上是关于2 个表的复杂连接的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎么连接查询2个表?

如何为复杂的 sql 查询获取中间数据。 PostgreSQL

性能调优复杂 SQL 连接

如何根据非条件连接 2 个表的结果

是否可以在从 2 个表创建的复杂视图中插入新行?

Postgres 使用跨 2 个表的内部连接进行更新?