了解查询:为每个商店选择最昂贵的产品

时间:2019-04-03 09:27:33

标签: sql

现在学习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进行比较?如果它在同一存储中,那么两个表不应该是同一实例吗?

谢谢!

2 个答案:

答案 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表的第二个实例

创建并比较了两个产品表实例,原因是:

  • 两个是不同的实例,并且由于指定了不同的别名,两者都不相同
  • 第一个实例在select语句中,并将返回所有产品。在结果中,要仅获取价格最高的产品,将使用另一个产品表实例
  • 请注意,在产品表的第二个实例中,将比较Store.sid而不是x.pid

希望这会有所帮助