gpt4 book ai didi

sql - INNER JOIN 和 LEFT/RIGHT OUTER JOIN 的问题

转载 作者:行者123 更新时间:2023-12-02 14:12:39 25 4
gpt4 key购买 nike

我有三个表:

  • 订单
    • OrderId,int PK
    • CustomerId,int FK 到客户,允许 NULL


  • 客户
    • CustomerId,int PK
    • CompanyId,int FK 到公司,不允许 NULL


  • 公司
    • CompanyId,int PK
    • 名称,nvarchar(50)

我想选择所有订单,无论它们是否有客户,如果有客户,还要选择客户的公司名称。

如果我使用这个查询...

SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Orders
LEFT OUTER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
INNER JOIN Companies
OM Customers.CompanyId = Companies.CompanyId

...它仅返回有客户的订单。如果我用 LEFT OUTER JOIN 替换 INNER JOIN...

SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Orders
LEFT OUTER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
LEFT OUTER JOIN Companies
OM Customers.CompanyId = Companies.CompanyId

...它有效,但我不明白为什么这是必要的,因为客户公司之间的关系是必需的:客户必须 有一家公司。

另一种可行的方法似乎是:

SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Companies
INNER JOIN Customers
ON Companies.CompanyId = Customers.CompanyId
RIGHT OUTER JOIN Orders
OM Customers.CustomerId Orders.CustomerId

这个查询具有我期望的内部和外部联接的数量,但问题是它对我来说很难阅读,因为我将我的查询作为订单的查询,记住订单在哪里是选拔的“根”而不是公司。另外,RIGHT OUTER JOIN 的用法对我来说相当陌生。

最后一个查询是 SQL Server Reporting Services 报表设计器生成的查询的一小部分。我正在尝试在没有设计器界面的情况下手动编写查询,因为它非常拥挤,并且在进行多次更改后维护查询时遇到问题,并且预计将来会有更多更改。因此,我想以某种方式为查询提供一个可读的结构。

问题:

  1. 为什么查询 1 没有按我的预期工作?
  2. 尽管(或因为?)查询 2 使用两个 LEFT OTHER JOINS,但它是否是正确的解决方案?
  3. 查询 3 是正确的解决方案吗?
  4. 有更好的方法来编写查询吗?
  5. 是否有一些通用的经验法则和实践如何以良好的可读方式编写具有大量外部和内部联接的查询?

最佳答案

从语义上讲,连接按照它们在 from 子句中出现的顺序进行处理。 (由于 SQL 优化,它们实际上可能不会按此顺序执行,但顺序对于定义结果集很重要。)

所以,当你这样做时:

from orders left outer join customers inner join companies

(我省略了 on 子句,这些子句会分散我们的注意力。)

SQL 被解释为:

from (orders left outer join customers) inner join companies

您正在执行内连接,因此值必须出现在两侧。在您的情况下,这会撤消左外连接的效果。

你想要:

from orders left outer join (customers inner join companies)

这里有一些解决方案。

我的首选解决方案是对所有连接使用左外连接。事实上,为了可读性和可维护性,我编写的几乎每个查询都只是连接表的左外连接[内]连接。如果您能够以一致的形式编写查询,则必须解析查询以了解连接的语义似乎是不必要的工作。

另一种解决方案是使用括号:

from orders left outer join (customers inner join companies)

另一个解决方案是子查询:

from orders left outer join (select . . . from customers inner join companies) cc

关于sql - INNER JOIN 和 LEFT/RIGHT OUTER JOIN 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16442900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com