【问题标题】:SQL - INNER JOIN with AND vs using sub-querySQL - 使用 AND 与使用子查询的 INNER JOIN
【发布时间】:2019-05-15 10:57:47
【问题描述】:

我正在为book练习题“SQL 练习题:57 个初级、中级和高级挑战,您可以使用“边做边学”的方法来解决”。第 31 题是 -

没有 EmployeeID 4 订单的客户

一位员工(Margaret Peacock,EmployeeID 4)下了最多的订单。但是,有些客户从未向她下过订单。只显示那些从未向她下过订单的客户。

我所做的解决方案创建了一个临时表“cte”并将其与现有表连接起来。实际上不漂亮或不可读 -

with cte as
    (Select Customers.CustomerID 
    from customers
    where CustomerID not in 
        (select Orders.CustomerID from orders where orders.EmployeeID = '4'))

 select *  
 from cte left join 
    (select CustomerID from Orders where Orders.EmployeeID = '4') O
     on cte.CustomerID = O.CustomerID

我在网上找到了以下解决方案-

SELECT c.CustomerID, o.CustomerID
FROM Customers AS c
LEFT JOIN Orders AS o ON o.CustomerID = c.CustomerID AND o.EmployeeID = 4
WHERE o.CustomerID IS NULL;

哪个更好。

我的问题 - 我什么时候可以在 JOIN 中使用 ORAND 子句?有什么优势?是不是在where子句之前执行了JOIN?

谢谢,

阿萨夫

【问题讨论】:

  • 是的,JOIN 在 WHERE 子句之前执行。
  • "JOIN 是在 where 子句之前执行的吗?" (显然,)这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: sql sql-server join common-table-expression


【解决方案1】:

JOIN 条件可以包含任何布尔比较,甚至是使用EXISTS 的子查询和相关子查询。可以表达的内容没有限制。

不过,只是一个注释。 =AND 对性能有好处。不平等往往是绩效杀手。

至于你的具体问题,我认为以下是对问题的更直接的解释:

SELECT c.CustomerID
FROM Customers c
WHERE NOT EXISTS (SELECT 1
                  FROM Orders o 
                  WHERE o.CustomerID = c.CustomerID AND
                        o.EmployeeID = 4
                 );

也就是说,获取所有与员工 4 不存在订单的客户。

【讨论】:

  • 谢谢!您的解决方案是正确的,但是这本书希望我从 Orders 表中提供额外的客户 ID 列。
  • @Assaf 。 . .您可以只包含客户表中的客户 ID。匹配条件要求它们相同。
【解决方案2】:

一般来说,我建议您始终选择最易读的查询版本,除非您可以用真实数据实际衡量性能差异。在这种情况下,基于成本的优化器应该选择一种执行查询的好方法以返回您想要的结果。

对我来说,JOIN 比 CTE 更易读很多

【讨论】:

  • 感谢您的回答。首先,我确实尝试了这种方法,但没有返回任何记录。这本书说 - “请注意,对于外部连接,where 子句上的过滤器在连接之后应用。”
【解决方案3】:

这是另一个解决方案

SELECT * FROM(
(SELECT Customers.CustomerID AS Customers_ID
      FROM Customers) AS P
          LEFT JOIN  
           (Select Orders.CustomerID from Orders
            where Orders.EmployeeID=4) as R
             on R.CustomerID = P.Customers_ID
              )
               WHERE R.CustomerID  IS NULL
               ORDER BY R.CustomerID DESC

【讨论】:

  • 这没有回答所提出的问题。
猜你喜欢
  • 2017-12-21
  • 2012-11-04
  • 1970-01-01
  • 2012-09-23
  • 2018-01-27
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多