我希望能够解释这两个查询之间逻辑差异的人。也许你也可以解释性能差异。 (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)
提前致谢。
答案 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)
上的索引。