哪个是更好的查询,两者之间有什么区别
SELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS
(SELECT *
FROM Sales.Orders AS O
WHERE O.custid = C.custid
AND O.orderdate = '20180212');
SELECT custid, companyname
FROM Sales.Customers AS C
INNER JOIN Sales.Orders AS O
on O.custid = C.custid
AND O.orderdate = '20180212'
答案 0 :(得分:0)
根据数据和数据库,两个查询实际上可能具有相同的执行计划。这两个查询之间的主要结构差异是,如果联接版本在给定日期与多个订单匹配,则联接版本可能导致给定的客户记录重复多次。 EXISTS
查询不会发生这种重复。因此,要使第二个连接版本相同,可以SELECT DISTINCT
:
SELECT DISTINCT custid, companyname
FROM Sales.Customers c
INNER JOIN Sales.Orders o
ON o.custid = c.custid
WHERE o.orderdate = '20180212';
EXISTS
查询通常是表达查询的最有效方法。您使用这两个版本中的哪个取决于您更喜欢哪个,想要什么输出以及哪个版本似乎有更好的执行计划。