带子查询的SQL查询,没有子查询比较

时间:2017-08-13 01:57:01

标签: sql sql-server sql-server-2014

我希望能够解释这两个查询之间逻辑差异的人。也许你也可以解释性能差异。 (DB是Microsoft Northwind)。

- 加入

select distinct c.CustomerID, c.CompanyName, c.ContactName  from orders as o inner join customers as c
on o.CustomerID = c.CustomerID

- SubQuery

select customerid, companyname, contactname, country from customers
where customerid in (select distinct customerid from orders)

提前致谢。

1 个答案:

答案 0 :(得分:3)

第一个生成一个中间结果集,包含所有客户的所有订单。然后使用select distinct减少它们。

第二个只是选择客户而不必在以后减少它们。它应该更有效率。但是,子查询中不需要select distinct(使用in自动完成)。

我会将逻辑编写为:

select c.customerid, c.companyname, c.contactname, c.country
from customers c
where exists (select 1
              from orders o
              where o.customerid = c.customerid 
             );

这可以很容易地使用orders(customerid)上的索引。