繁体   English   中英

SQL-使用AND与使用子查询进行INNER JOIN

[英]SQL - INNER JOIN with AND vs using sub-query

我练的问题 “SQL实践问题:57初级,中级和高级的挑战,为您使用解决‘学边做’的方式”。 问题31是-

没有订购EmployeeID 4的客户

一位员工(玛格丽特·孔雀,员工ID 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子句? 有什么优势? JOIN是在where子句之前执行的事实吗?

谢谢,

阿萨夫

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没有订单的客户。

通常,我建议您始终选择查询的可读性最高的版本,除非您可以实际测量实际数据的性能差异。 在这种情况下,基于成本的优化程序应选择一种执行查询以返回所需结果的好方法。

对我来说, JOIN很多比CTE更具可读性。

这是另一个解决方案

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM