1

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

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 中返回了两行,值为“一”和“二”。

“不在”中得到了 99% 的正确结果,但随机丢失了一些值。这是什么原因?

编辑:对不起,错字。解决它。

4

2 回答 2

7

我敢打赌 my_table2 在 my_value 列中包含 NULL 值。如果您的列包含 NULL 值,NOT IN 将无法正常工作,请参阅有关 EXISTS / IN 和 NULL 值的 Techrepublic 文章

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

于 2012-12-20T20:32:37.053 回答
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' 确实会返回该行。

于 2012-12-20T20:36:31.230 回答