[英]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.