[英]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
使用OR
, AND
子句? 有什么優勢? 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.