我正在尝试执行此查询:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
但是我没有结果。我测试了一下,而且我知道语法有问题。在MySQL中,这样的查询可以完美地工作。我添加了一行以确保表mac
中不存在该行consols
,但仍未给出任何结果。
Answers:
使用NOT IN时,应确保所有值都不为NULL:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (
SELECT mac
FROM consols
WHERE mac IS NOT NULL -- add this
)
WHERE mac IS NOT NULL
子查询中的子句是不需要的,因为它In(...)
总是删除NULL(和重复项)。因为集合不能包含NULL
IS NOT NULL
。巢SELECT
归来了一些NULLS
,那绊倒了IN(SELECT...)
。
IS NOT NULL
起作用的原因。
NULL
在NOT IN
子句中使用不起作用,因为与的比较NULL
既不正确也不错误。sqlbadpractices.com/using-not-in-operator-with-null-values
使用NOT IN时,您还应该考虑NOT EXISTS,它可以静默处理null情况。另见PostgreSQL Wiki
SELECT mac, creation_date
FROM logs lo
WHERE logs_type_id=11
AND NOT EXISTS (
SELECT *
FROM consols nx
WHERE nx.mac = lo.mac
);
NOT EXISTS
vs时会造成巨大的性能损失... NOT IN
consols.mac
列NULL
还是NOT NULL
?