【问题标题】:Is there a way to rewrite this SQL query with '(NOT) IN' instead of 'NOT EXISTS'?有没有办法用 '(NOT) IN' 而不是 'NOT EXISTS' 重写这个 SQL 查询?
【发布时间】:2020-10-24 12:25:34
【问题描述】:

任务是编写一个返回第一位就职总统的 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,我会很高兴看到他们都从中学到最多。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 我不确定。我对 SQL 很陌生,当我安装 SQL developer 时,这些总裁表已经在那里

标签: sql exists not-exists notin


【解决方案1】:

您不能真正使用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;

【讨论】:

  • 非常感谢!我喜欢你在那里写的替代解决方案,它们很有意义。
【解决方案2】:

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

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

【讨论】:

  • 我完全没有想到 ALL 运算符..这是另一个很好的解决方案,谢谢!
【解决方案3】:

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

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

【讨论】:

  • 是的,这似乎与 Gordon 的回答相同,但是我还不知道顶级语法,很高兴知道它,谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 2015-10-13
  • 2015-07-06
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多