该查询中有一个错误 - 它永远不会返回任何行,因为没有价格不等于自身。
要工作,它应该是:
...
WHERE si.price < s.price)
假设进行了更改,其工作原理的解释是内部查询对表中的每一行执行一次并且取决于外部表(称为“共同相关子查询”)。因为在内部查询中使用了同一张表,所以您需要给外部表起别名(在本例中为“s”)。内部查询断言没有(其他)价格低于正在执行的行中的价格。
顺便说一句,内部查询的别名是不必要的 - 您可以删除“s1”,它仍然可以工作,因为内部查询是默认范围:
SELECT beer
FROM sells s
WHERE NOT EXISTS (
SELECT *
FROM sells -- no alias needed
WHERE price <= s.price)
此外,这是一个“坏”查询,因为相关子查询会导致执行“n”个查询(每行一个)。你最好使用min()
聚合函数:
SELECT beer
FROM sells
WHERE price = (SELECT min(price) FROM sells)
除了这个查询更简单、更容易理解(两件好事)之外,它执行得更快,因为只执行了两个查询(一个子查询找到最低价格,一个子查询获取包含它的整行)。
最后,最后一个(尽管是次要的)错误是,如果有多个价格相同的低价啤酒,所有这些都将返回多行。要返回最低价格的啤酒,您需要将行数限制为 1 并决定如何打破平局(可能是在名称上)。事实上,只返回一行可以实现更简单的查询:
select beer
FROM sells
ORDER BY price
LIMIT 1
如果您需要不断打破平局(即不以相同的最低价格返回随机的同价啤酒),也可以按名称订购:
select beer
FROM sells
ORDER BY price, beer
LIMIT 1