这是 范围的问题 。Oracle会从最内层的子查询开始,并向外验证标识符。如果我们将表别名添加到您的原始查询中,则情况可能会变得更加清晰:
SELECT t1.tran_number
FROM table_a t1
WHERE t1.customer_id IN
(SELECT t1.customer_id
FROM table_b t2
WHERE t2.customer_key = 89564
AND ( t2.other_phn_area_code
|| t2.other_phnum_pfx_num
|| t2.other_phnum_sfx_num IN
(123456789)))
AND t1.phn_area_code || t1.phnum_pfx_num || t1.phnum_sfx_num IN (123456789)
实际上,外部查询使用子查询作为EXISTS的测试,即仅检查CUSTOMER_KEY和其他列的给定值是否存在。如果这不是您想要的,则应在子查询中更改列名。(这是一个很好的选择:您可能会从主查询中得到令人困惑的结果,这就是为什么要单独调查子查询的原因)。
在这些情况下使用别名始终是一种好习惯。如果您对子查询使用了这样的别名:
....
WHERE t1.customer_id IN
(SELECT t2.customer_id
FROM table_b t2
WHERE t2.customer_key = 89564
....
该错误将立即显而易见。
sqlReference确实在子查询中解释了作用域的操作,但是很难找到。什么它说是这样的: