涉及超过 2 个表连接的概念 SQL JOIN 问题

Posted

技术标签:

【中文标题】涉及超过 2 个表连接的概念 SQL JOIN 问题【英文标题】:Conceptual SQL JOIN questions involving more than 2 table joins 【发布时间】:2013-12-11 09:52:24 【问题描述】:

我知道加入 2 个表。但是,在加入 3 个或更多表时,我会想到以下问题。这些可能看起来很基本,但如果有人解释它会很棒。 注意我已经浏览了链接Understanding how JOIN works when 3 or more tables are involved. [SQL]

查询问题 1 和 2:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID
LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID;

问题1: LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID此连接是否发生在第一次连接的结果集上?

问题2:如果条件是:LEFT JOIN Regions ON Customers.RegionID = Regions.RegionID 现在会发生什么?这个连接发生在什么结果集上?它是否出现在“来自客户”结果集或第一个加入结果集中?

查询问题 3:

SELECT count(distinct Customers.CustomerName), count(Orders.OrderID), count(Regions.RegionID)
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID
LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID;

问题3: 如果颠倒连接顺序,结果会有所不同吗?在什么情况下会发生变化?

查询问题 4:

SELECT count(Regions.RegionID)
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID
LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID;

问题 4:(这是我最困惑的地方) 当涉及到聚合时,FROM 中的 table_name 应该是什么?它是否取决于要聚合的 table.column? 对于问题的目的,假设需要 2 个连接,我们只需要 count(RegionID)。

【问题讨论】:

我认为是这样的:连接将首先创建一个包含所有组合(即客户 x 订单 x 区域)的结果集,其中包含所有表中的列。 ON + WHERE 然后过滤结果。 根据定义,连接总是涉及多个表。没有“与单个表连接”(即使您使用同一个表两次它仍然是与两个表的连接) @adrianm 想象一下包含数百万行的表。坏事,对吧?索引是一个神奇的词。在构建结果集之前进行过滤,然后由WHERE 过滤。 @fancyPants,过滤的方式和顺序是一个实现细节 【参考方案1】:

在我看来,您有三个表,它们具有以下关系:与客户和区域相关联的订单以及与区域相关联的客户。

1) 是的 2)第二个查询将客户链接到区域,因此在您获得订单区域之前,您拥有客户的区域(可能会有所不同)。如果您愿意,您可以通过区域表上的两个连接获得两者,一个用于客户,一个用于订单 3)使用左连接更改顺序,结果可能会有所不同。例如在您的查询中,您可以获得所有客户(最终还有没有订单的客户)以及可选的订单和地区。如果您有类似“...FROM region LEFT JOIN customer ...”之类的内容,您将拥有所有区域并最终在它们上下订单。 4) 计数会影响连接的结果,并且可以涉及其中的任何列,而不仅仅是用于聚合的列

【讨论】:

以上是关于涉及超过 2 个表连接的概念 SQL JOIN 问题的主要内容,如果未能解决你的问题,请参考以下文章

NNER JOIN连接两个表三个表五个表的SQL语句

SQL Join 2个表,返回只存在1个值而没有其他值的记录

sql删除使用内连接超过3个表

连接 2 个表并计算 SQL 中特定字段的出现次数

SQL - 连接 2 个表并返回 2 行之间的值差异

SQL LEFT JOIN 从第二个表中排除两条记录