这两个版本有什么区别

bfrts1fy  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(425)

下面给出的两个版本有什么不同??

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')
isr3a4wc

isr3a4wc1#

这取决于所选表中的数据。如果要选择 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');
xhv8bpkk

xhv8bpkk2#

第二个查询效率更高,因为它不会带来 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 子句):几十年前的这种语法使编写、读取和维护查询变得更加困难,不应该在新代码中使用。

相关问题