首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL in Any vs != Any

SQL in Any vs != Any
EN

Stack Overflow用户
提问于 2019-03-16 10:13:01
回答 2查看 325关注 0票数 1

我有以下表格:

学生:

代码语言:javascript
复制
+------+---------+
| Snum |  Sname  |
+------+---------+
| S1   | Charles |
| S2   | Amy     |
| S3   | John    |
+------+---------+

课程:

代码语言:javascript
复制
+-----+------------+
| cid | coursecode |
+-----+------------+
| C1  | CMPT222    |
| C2  | ASC111     |
+-----+------------+

注册:

代码语言:javascript
复制
+------+-----+
| sid  | cid |
+------+-----+
| S1   | C1  |
| S2   | C2  |
+------+-----+

一般来说,我有三个学生,其中两个被录取了。

查询为:查找未注册的序列号:

代码语言:javascript
复制
SELECT DISTINCT S.snum
FROM Student S
WHERE S.snum! = any (SELECT E.snum FROM Enrolled E )

此查询返回:

代码语言:javascript
复制
1
2
3

这是错误的。

我的理解是:对于外部查询中的每个元组,ANY都会检查是否至少有一个元组。如果是,则返回TRUE。如果我们使用!=,那么它应该返回3。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2019-03-16 11:07:34

这是您的查询:

代码语言:javascript
复制
SELECT DISTINCT S.snum
FROM Student S
WHERE S.snum <> any (SELECT E.snum FROM Enrolled E )

基本上,如果子查询返回多个值,则条件始终为真。为什么?那么,考虑一下返回的集合是12。如果将一个值与这些值中的一个值进行比较,则条件始终为真。记住:1 <> 2。因此,如果该值与第一个值匹配,则与第二个值不匹配。

有一些简单的方法可以解决这个问题。例如:

代码语言:javascript
复制
WHERE NOT (S.snum = any (SELECT E.snum FROM Enrolled E ))

或者:

代码语言:javascript
复制
WHERE S.snum NOT IN (SELECT E.snum FROM Enrolled E )

实际上,我不喜欢NOT IN,因为它以不同的方式对待NULL值。在这种情况下,我更喜欢NOT EXISTS

票数 0
EN

Stack Overflow用户

发布于 2019-03-16 19:38:23

因为您评估的谓词总是真的,所以= any()至少要有一个等价的。Not equal或<> any()至少有一个不等价。由于子查询返回的集合,最后一个谓词始终为true,而前者只返回s1s2值。

请注意,如果您的子查询只返回一个值,那么您的结果选择将是不同的。

长文解释

您的子查询返回以下值:s1s2.Then,您的关系型数据库将逐行计算谓词。然后,

s1 <> s1 -> false

s1 <> s2 -> true

谓词求值,因any()true

下一个值,

s2 <> s1 -> true

谓词求值true...第三个值:

s3 <> s1 -> true

请注意,some()any()是等价的子句。

any()想象成一个or门。每次找到true (输入)时,输出都是true。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55192819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档