无法根据“不在哪里”进行过滤

时间:2019-04-03 18:52:10

标签: sql sqlite

我有一个带有两个表的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 INthe standard method,可以执行我要执行的操作。我在做什么错了?

2 个答案:

答案 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)