如何在不使用子查询的情况下编写SQL,从而实现以下查询?

3
SELECT C.pid
FROM Catalog C, Suppliers S
WHERE S.sname = ‘Yosemite Sham’ AND C.sid = S.sid
AND C.cost ≥ ALL (Select C2.cost
FROM Catalog C2, Suppliers S2
 WHERE S2.sname = ‘Yosemite Sham’ AND C2.sid = S2.sid)

不良习惯:使用旧式JOIN 在 ANSI-92 SQL 标准(20多年前)中,旧的逗号分隔表列表样式已被正确的ANSI JOIN语法所取代,因此不建议再使用。 - marc_s
1个回答

3

首先,学习使用正确、明确的JOIN语法。

然后,如果您假设最大成本只会发生一次,可以执行以下操作:

SELECT C.pid
FROM Catalog C JOIN
     Suppliers S
     ON C.sid = S.sid
WHERE S.sname = 'Yosemite Sham'
ORDER BY  c.Cost DESC
FETCH FIRST 1 ROW ONLY ;

请注意,最后一个从句是ANSI标准SQL。一些数据库使用其他方法实现相同的功能。
如果没有这个假设,基本上所有合理的方法都使用子查询。以下是一种不使用子查询的方法:
SELECT C.pid
FROM Catalog C JOIN
     Suppliers S
     ON C.sid = S.sid LEFT JOIN
     Catalog C2
     ON C2.sid = C.sid AND
        C2.Cost > C.Cost
WHERE S.sname = 'Yosemite Sham' AND c2.Cost IS NULL
ORDER BY c.Cost DESC;

注意:这假设sidsname是一对一的。这是一种便利(很可能是真实的),有助于避免额外连接到Suppliers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接