Oracle SQL - “不在”缺少一些行?

时间:2012-12-20 20:18:41

标签: sql oracle notin

我有一个非常简单的查询来查找一个表中的某些值,而不是另一个表。

select * from my_table were my_value in
   ('one','two','hello','blue')
and my_value not in
   (select my_value from my_table_2)

这会返回两行 - my_table的行包含'one'和'two'。

但是,我跑了这个:

select * from my_table_2 where my_value in ('one','two')

并且震惊地发现这在my_table_2中返回了两行,其值为“1”和“2”。

“不在”中获得99%正确的东西,但随机遗漏了一些值。造成这种情况的原因是什么?

编辑:对不起,错字。修正了它。

2 个答案:

答案 0 :(得分:7)

我敢打赌,my_table2在my_value列中包含NULL值。 如果您的列包含NULL值,则NOT IN无法正常工作,请参阅Techrepublic article on EXISTS / IN and NULL values

在这种情况下我会使用NOT EXISTS,应该按预期工作。

答案 1 :(得分:2)

此问题的原因是两个表之间列类型的差异。

my_table使用varchar2(10),但是my_table_2使用了char(10)。因此,my_table_2实际上返回my_table_1中的内容以及一些空格。有趣的是,即使'apple',例如'apple',也可以从my_table_2中选择my_value,其中my_value ='apple'会返回该行。