该查询中存在一个错误 - 它永远不会返回任何行,因为没有价格不等于自身。
工作,它应该是:
...
WHERE si.price < s.price)
假设做出改变,它是如何工作的解释s表示内部查询表中的每一行执行一次,依赖于外表(称为“共同相关的子查询”)。因为在内部查询中使用了同一个表,所以您需要别名外部表(在本例中为“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
我可以给你答案,而无需数据库:d – Sebas
答案是已经在那里,我只是想明白它。 – Ricecooker
将一些数据放到[小提琴](http://sqlfiddle.com)中,因为它可以更容易地看到什么是什么,并探索您的问题。 – hd1