【发布时间】: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 中使用 OR、AND 子句?有什么优势?是不是在where子句之前执行了JOIN?
谢谢,
阿萨夫
【问题讨论】:
-
是的,JOIN 在 WHERE 子句之前执行。
-
"JOIN 是在 where 子句之前执行的吗?" (显然,)这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。
标签: sql sql-server join common-table-expression