这两个版本有什么区别

时间:2020-06-20 05:00:55

标签: sql database join select group-by

下面给出的两个版本之间有什么区别?

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

找到供应红色或绿色零件的供应商的提示:

版本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')

2 个答案:

答案 0 :(得分:0)

这取决于您选择的表中的数据。如果要从“供应商”表中选择sid,则可以使用第一个版本。或者,如果要从目录表中使用,则可以使用第二个版本。但是无需在查询中使用OR子句。相反,您必须使用IN子句。或仅应在从两个不同的列中过滤替代条件时使用。

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

答案 1 :(得分:0)

第二个查询效率更高,因为它没有带来supplier表(您不需要,因为您只想要供应商sid,可以在{{ 1}}表)。

但是,我认为它并不能完全满足您的要求。如果供应商的目录中有一个以上的红色或绿色部分,它将在结果集中出现几次。我建议改为聚合。

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子句中使用逗号):几十年前的这种语法使它变得非常重要更加难以编写,阅读和维护查询,因此不应在新代码中使用。