我有一个带有两个表的SQLite数据库,每个表都有行id
。我正在尝试根据table2中的 not 来过滤table1中的数据。表1具有例如:
In: SELECT id FROM table1 LIMIT 4
Out:
'0000001'
'0000002
'0000003'
'0000004'
并且table2具有:
In: SELECT id FROM table2 LIMIT 10
Out:
None
None
None
'0001098'
'0001098'
'0001098'
'0001098'
'0001098'
'0001098'
'0001098'
我想返回其id列不在table2中的table1中的所有值,我尝试这样做:
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2)
但这不会返回任何值。如果我使用SELECT id FROM table1 EXCEPT SELECT id FROM table2
,它可以正常工作。据我了解,WHERE COLUMN NOT IN
是the standard method,可以执行我要执行的操作。我在做什么错了?
答案 0 :(得分:2)
原因是id
中的table2
包含null
个值。
如果您使用此:
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2 WHERE id IS NOT null)
它将起作用。
我没有在 SQLite 文档中找到与此情况有关的任何内容,但是对于来自以下位置的 MySQL :
https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in
为了遵守SQL标准,IN不仅会在以下情况下返回NULL: 左侧的表达式为NULL,但如果没有匹配,则为 在列表中找到并且列表中的表达式之一为NULL
所以这是SQL标准,这意味着在您的情况下,该语句:
IN (SELECT id FROM table2)
先返回NULL
,然后
NOT IN (SELECT id FROM table2)
还返回NULL
。
因此,您的病情不会评估为TRUE
,并且您不会得到任何结果。
答案 1 :(得分:0)
使用NOT EXISTS代替
SELECT id
FROM table1 t1
WHERE NOT EXISTS(SELECT 1 FROM table2 t2 WHERE t1.id = t2.id)