我编写了一个查询来检查我的表与通用表的完整性。查询如下
SELECT * FROM Universal
WHERE UNIVERSAL.TYPE=MYTYPE
AND Universal.CLASS=MYCLASS
AND Universal.ID NOT IN (SELECT Mytable.ID FROM Mytable)
正如您所看到的,我在寻找完整性之前过滤了通用表,两者都在同一查询中。我现在发现,当我删除 NOT IN 部分时,查询运行良好,但是当我包含它时,我没有得到任何结果。这个查询有什么问题吗?我怎样才能以其他形式编写,例如使用联接或其他形式?
最佳答案
SELECT * FROM Universal
WHERE UNIVERSAL.TYPE=MYTYPE
AND Universal.CLASS=MYCLASS
AND Universal.ID NOT IN (SELECT Mytable.ID FROM Mytable
WHERE Mytable.ID IS NOT NULL)
空且不在...!
SELECT
返回 WHERE
子句为 TRUE
的行,并且不返回 FALSE
行。
此外,也不会返回 UNKNOWN
行(即 NULL
行。)这通常不是问题,但当涉及到 NOT IN
时许多程序员感到惊讶。
假设您有一个汽车表,并且您想要返回列表(或子查询)中未找到的颜色的汽车:
select * from cars where color not in ('red', 'blue')
很容易理解,除了红色和蓝色之外的所有汽车都会返回。
但是如果颜色列表用未知颜色(NULL
)扩展,则它将是:
select * from cars where color not in ('red', 'blue', NULL)
现在 WHERE
子句不知道例如是否黄色汽车是否在列表中,它肯定不是红色或蓝色,但我们无法判断它是否不是那种未知的 NULL
颜色...即WHERE
子句变得未知,并且不返回任何行!
在这里,程序员可以通过在子查询中指定IS NOT NULL
来避免未知的颜色。 (或者转换为 NOT EXISTS
,这是“空安全”。)
关于mysql - 以不同的方式编写 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29147956/