有没有办法用“(NOT) IN”而不是 'NOT EXISTS' 重写此 SQL 查询?
Is there a way to rewrite this SQL query with '(NOT) IN' instead of 'NOT EXISTS'?
任务是编写 SQL 查询 returns 有史以来第一位就职总统。
table 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
的解决方案吗?
而是使用IN
、NOT IN
、EXISTS
?
另一个约束是不使用 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)
我认为这几乎是 Gordon 的第二个答案,但我不熟悉 SQL 服务器中的 FETCH
,所以我会使用 top
.
select top(1) a1.pres_name, a1.year_inaugurated
from administration a1
order by a1.year_inaugurated asc
任务是编写 SQL 查询 returns 有史以来第一位就职总统。
table 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
的解决方案吗?
而是使用IN
、NOT IN
、EXISTS
?
另一个约束是不使用 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)
我认为这几乎是 Gordon 的第二个答案,但我不熟悉 SQL 服务器中的 FETCH
,所以我会使用 top
.
select top(1) a1.pres_name, a1.year_inaugurated
from administration a1
order by a1.year_inaugurated asc