我有一个非常简单的查询来查找一个表中的某些值,而不是另一个表。
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%正确的东西,但随机遗漏了一些值。造成这种情况的原因是什么?
编辑:对不起,错字。修正了它。答案 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'会返回该行。