问题是:查找价格最高的打印机型号。结果集:型号,价格
并且数据库模式是:打印机(代码,型号,颜色,类型,价格)
我想使用自我联接找到最高价格。我写的查询是:
select model,price
from printer
where not exists
(
select p2.model,p2.price
from printer p1, printer p2
where p2.price<p1.price
)
子查询似乎是正确的,因为它不包括最高查询,但整个查询都给出了空表。问题的链接是:http://www.sql-ex.ru/learn_exercises.php#answer_ref
您尚未正确编写相关子查询。您需要引用您正在读取的表(即外部查询),而不是再次将其包含在子查询中:
SELECT model, price
FROM printer p1
WHERE NOT EXISTS (SELECT * FROM printer p2 WHERE p2.price > p1.price)
请注意,这不是自联接,这是一个相关的子查询。要使用自联接编写此函数,请使用LEFT JOIN
并检查联接表中的值是否为NULL
:
SELECT p1.model, p1.price
FROM printer p1
LEFT JOIN printer p2 ON p2.price > p1.price
WHERE p2.model IS NULL
也请注意,正如@kmoser在注释中指出的那样,您可以使用ORDER BY
和LIMIT
更简单地执行此操作:
SELECT model, price
FROM printer
ORDER BY price DESC
LIMIT 1
SQLFiddle上所有三个查询的[Demo。