现在学习SQL,我的导师最近发布了此问题以及他的建议查询:
Store(sid, sname) //sid primary key here
Product(pid, pname, price, sid) //sid foreign key here
目标:为每家商店找到最昂贵的商品
他的建议查询是这样:
SELECT sname, x.pname
FROM Store, Product x
WHERE Store.sid = x.sid and
x.price >=
ALL (SELECT y.price
FROM Store, Product y
WHERE Store.sid = y.sid)
GROUP BY sname;
我在理解它时遇到了一些麻烦:
x
并将其与另一个产品表实例Y
进行比较?如果它在同一存储中,那么两个表不应该是同一实例吗? 谢谢!
答案 0 :(得分:2)
您应该更换家教。您应该只学习正确,明确,标准 JOIN
的语法。逗号在SQL中已经过时了数十年。
查询应类似于:
SELECT s.sname, p.pname
FROM Store s JOIN
Product p
ON s.sid = p.sid AND
p.price >= ALL (SELECT p2.price
FROM Product p2
WHERE p2.sid = s.sid
);
(请注意,这也解决了子查询的问题。)
这也引入了表别名,使查询更易于编写和阅读。 所有列均以表名限定,这是最佳做法。
这是做什么的?外部查询产生所有产品和所有商店。其中一些价格最高。
WHERE
子句正在提取这些产品。怎么样?子查询返回给定商店的所有价格。 >= ALL
的意思是“让我获得价格大于或等于商店中所有其他价格的所有行”。
我认为这通常是使用聚合函数编写的:
SELECT s.sname, p.pname
FROM Store s JOIN
Product p
ON s.sid = p.sid AND
p.price >= (SELECT MAX(p2.price)
FROM Product p2
WHERE p2.sid = s.sid
);
答案 1 :(得分:0)
建议的查询中应进行一次更改以提供预期的结果:
SELECT sname, x.pname
FROM Store, Product x
WHERE Store.sid = x.sid and
x.price >=
ALL (SELECT y.price
FROM Product y
WHERE Store.sid = y.sid)
-删除了不需要的Store表的第二个实例
创建并比较了两个产品表实例,原因是:
希望这会有所帮助