下面给出的两个版本之间有什么区别?
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')
答案 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
子句中使用逗号):几十年前的这种语法使它变得非常重要更加难以编写,阅读和维护查询,因此不应在新代码中使用。