Sql where子句中的子查询似乎什么也不返回,但对其自身运行查询会返回数据

Sql where子句中的子查询似乎什么也不返回,但对其自身运行查询会返回数据,sql,oracle,Sql,Oracle,我有一个SQL查询,在where子句中有一个嵌套的select。如果我自己运行子查询,我会返回一行。但是,如果将其作为嵌套查询运行,则不会返回任何结果。如果我用我知道返回的实际数据替换嵌套查询,则查询成功 select * from customers where id in (select people.id from people) 我不明白的是如果我跑步 select people.id from people 我得到数据,比如说ABC。如果我跑 select * from custo

我有一个SQL查询,在where子句中有一个嵌套的select。如果我自己运行子查询,我会返回一行。但是,如果将其作为嵌套查询运行,则不会返回任何结果。如果我用我知道返回的实际数据替换嵌套查询,则查询成功

select * from customers where id in (select people.id from people)
我不明白的是如果我跑步

select people.id from people
我得到数据,比如说ABC。如果我跑

select * from customers where id in ('ABC')

我得到数据。我们在Oracle数据库上,不确定这是否相关。

所以可能是您的ID是带有尾随空格的字符串。 请尝试以下方法:

select a.id, a.other_relevant_fields from customers a, people b 
where TRIM(a.id)=TRIM(b.id)
在people表上运行此测试(当然是在dev env中测试):

然后再次尝试查询(并尝试使用联接)


这应该适用于11g,但不确定早期版本。

人物
中是否有
id
null
的行?F.e.
select*from people,其中id为null
Do
people.id
customer.id
具有相同的数据类型?@Boumbles-那么它们的值就不同了。它们可能看起来是一样的,但它们不一样。无论它们控制字符、排序顺序差异(或Oracle使用的任何内容)、前导/尾随空格、数据类型转换问题或其他内容,您的查询都证明它们不相同;您可能会发现其中包含一些控制字符(在大多数IDE中,目视检查看起来像“ABC”,但实际上是“ABC”+chr(0)或其他一些不可打印的字符。@Boumbles不,最好的方法是清理人中的数据。您不是(也不会是)此数据的唯一用户。您不希望使用此数据的所有其他人都创建一些奇怪的select(或更糟的是,某些自定义函数)每次,更不用说创建约束和其他你花钱买的好东西了。做正确的事情并清理数据奇怪的是,这也不起作用。但是,如果我删除a.id=b.id并比较a和b返回的id,我可以看到它们是相同的。我只是看了一下,注意到co的最大长度列是不同的。列是定义为
varchar2
还是
char
的。它们是varchar2。最初一个的大小是150,另一个只有60。我重新调整了大小,所以它们现在都是150,但我仍然没有得到任何结果。你能在两个测试表中重新创建问题并提供sql转储吗?这就是我们最终要做的。一些非打印加载数据时,可编辑字符被放入数据库。
update people set ID = regexp_replace(ID, '[[:cntrl:]]','');
commit;