涉及超过 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 问题的主要内容,如果未能解决你的问题,请参考以下文章