sql没有抛出无效的标识符

时间:2014-06-26 09:11:14

标签: sql oracle10g oracle-sqldeveloper

我问这个问题,因为我没有收到错误,我预计会出现错误。 请帮助我了解在什么情况下这是可能的。我有一个问题:

select foracid,acct_name, schm_code, schm_type from tbaadm.gam  where
acid  in(select acid from tbaadm.iar);

此查询返回结果而不会抛出任何错误。我希望无效的标识符 因为表tbaadm.iar没有字段酸。 我跑的时候:

 select acid from tbaadm.iar;

我明白了:

ORA-00904: "ACID": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 772 Column: 8

我正在使用sqldeveloper和oracle 10g。这对我来说很奇怪。值得一提的是,tbaadm.iar中有一个字段是id,所以正确的查询应该是:

select foracid,acct_name, schm_code, schm_type from tbaadm.gam  where
acid  in(select entity_id from tbaadm.iar);

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

IN子句中使用的子查询可以引用外部查询中的列,因为这在相关子查询中是必需的。所以你的WHERE子句相当于:

WHERE acid IN (SELECT tbaadm.gam.acid FROM tbaadm.iar)

相关子查询的一个示例说明了为什么这是必要的:

SELECT *
FROM outer_table
WHERE somefield = (SELECT someotherfield 
                   FROM inner_table
                   WHERE inner_table.id = outer_table.inner_id)

这是更常见的用法,其中外部表中的字段用于子查询的WHERE子句中。但SQL并不挑剔使用外部查询的字段。它可以在允许表达式的子查询中的任何位置使用,包括SELECT子句。