簡體   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