如何在没有子查询的情况下为以下查询编写sql
问题描述:
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
语法。
然后,如果你认为最大的成本只发生一次,你可以这样做:
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;
注:这是假定sid
是1-1 sname
。这是一种方便(很可能是真实的),并有助于避免额外加入Suppliers
。
[不良习惯踢:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL标准中**旧式*逗号分隔的表*样式列表已替换为* proper * ANSI'JOIN'语法(**超过20年**之前),其使用是不鼓励的 –