2014-06-26 21 views
0

我在问这个问题,因为我没有得到一个错误,我期望应该有一个错误。 请帮我理解在什么情况下这是可能的。我有一个查询:sql不会抛出无效的标识符

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); 

这到底是怎么回事?

回答

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子句。

+0

子查询不应该有效吗?因为'SELECT tbaadm.gam.acid FROM tbaadm.iar'也不会执行? – ErrorNotFoundException

+0

子查询是有效的,因为它位于从'tbaadbm.gam'中选择的查询中。 – Barmar

+0

好的谢谢明白了。 – ErrorNotFoundException