有没有办法用'(NOT) IN'而不是"不存在"重写此SQL查询?



任务是编写一个SQL查询,返回有史以来第一位就职总统。 表中使用的两个属性administration应该是不言自明的。 在这里,您可以看到我有信心是正确的解决方案。

SELECT A1.pres_name, A1.year_inaugurated
FROM administration A1
WHERE NOT EXISTS
(SELECT NULL
FROM administration A2
WHERE A1.year_inaugurated > A2.year_inaugurated);

当我尝试学习SQL时,我想到了任何其他方法来编写此查询,但找不到。 还有其他不使用NOT EXISTS的解决方案吗? 而是使用INNOT INEXISTS? 另一个约束是不使用MIN函数。 如果不止一种解决方案不使用NOT EXISTS,我将很高兴看到所有这些解决方案都能从中学到最多的东西。

你不能真正使用NOT IN来写这个,但你可以使用标量子查询来写它:

SELECT A1.pres_name, A1.year_inaugurated
FROM administration A1
WHERE A1.year_inaugurated = (SELECT MIN(A2.year_inaugurated)
FROM administration A2
);

或者 - 假设没有任何重复的年份 - 使用ORDER BY和限制行的方法:

SELECT A1.pres_name, A1.year_inaugurated
FROM administration A1
ORDER BY A1.year_inaugurated ASC
FETCH FIRST 1 ROW ONLY;

获得所需结果的另一种方法是使用运算符ALL

SELECT pres_name, year_inaugurated
FROM administration
WHERE year_inaugurated <= ALL (SELECT year_inaugurated FROM administration)

我认为这几乎是戈登的第二个答案,但我不熟悉 SQL 服务器中的FETCH,所以我会使用top.

select top(1) a1.pres_name, a1.year_inaugurated
from administration a1
order by a1.year_inaugurated asc

最新更新