首页 > 解决方案 > 这两个版本有什么区别

问题描述

下面给出的2个版本有什么区别?

Suppliers(sid:integer, sname:string, address:string)
Parts(pid:integer, pname:string, color:string)
Catalog(sid:integer, pid:integer, cost:real)

查找供应红色零件或绿色零件的供应商的 sid:

版本 1:

SELECT S.sid    
FROM Suppliers S, Parts P, Catalog C
WHERE S.sid = C.sid AND P.pid = C.pid AND (P.color = 'red' OR P.color = 'green')

版本 2:

SELECT C.sid    
FROM Parts P, Catalog C
WHERE P.pid = C.pid AND (P.color = 'red' OR P.color = 'green')

标签: sqldatabasejoinselectgroup-by

解决方案


第二个查询效率更高,因为它不带supplier表(您不需要,因为您只需要sid可以在parts 表中找到的供应商)。

但是我不认为它完全符合您的要求。如果供应商的目录中有多个红色或绿色部件,它将在结果集中出现多次。我建议改为聚合。

select c.sid
from parts p
inner join catalog c on c.pid = p.pid
where p.color in ('red', 'green')
group by s.id

请注意,此版本的查询使用标准的显式连接(使用on关键字)而不是隐式连接(在from子句中使用逗号):几十年前的这种语法使得编写、读取和维护查询变得更加困难,并且应该不能在新代码中使用。


推荐阅读