select * from table where column in (sub query) where sub query return ORA-00904 [重复]

Posted

技术标签:

【中文标题】select * from table where column in (sub query) where sub query return ORA-00904 [重复]【英文标题】:select * from table where column in (sub query) where sub query return ORA-00904 [duplicate] 【发布时间】:2017-12-14 08:45:49 【问题描述】:

查询:

SELECT COLUMN_NAME FROM MY_TABLE

返回

ORA-00904 标识符无效,因为 MY_TABLE 中没有 COLUMN_NAME 列,到目前为止一切正常。

查询:

SELECT * 
FROM OTHER_TABLE 
WHERE COLUMN_NAME IN (SELECT COLUMN_NAME FROM MY_TABLE)

它不仅不会失败,还会返回完整的 OTHER_TABLE。仅当内部查询选择“外部”表中的列时才会发生这种情况。

如果我运行相同的查询,只需将内部查询选择列更改为在表中也不存在但在外部表中的表中也不存在的不同列。

SELECT * 
FROM OTHER_TABLE 
WHERE COLUMN_NAME IN (SELECT DIFFERENT_NAME FROM MY_TABLE)

DIFFERENT_NAME 列在 OTHER_TABLE 中不存在

它确实在 ORA-00904 无效标识符上失败。 1.使用外部查询中存在但内部查询中不存在的列的查询为什么不会失败? 2. 怎么会返回完整的表格?

【问题讨论】:

【参考方案1】:

假设我们有两个表:TA 字段为 ATB 字段为 B,现在让我们编写一些查询:

  select A   -- wrong: TB doesn't have A field
    from TB

但如果B 字段不为空且TA 不为空,则此OK 将返回整个TB 表:

  select *
    from TB 
   where B in (select B   -- <- B is from TB in both cases
                 from TA)

在这种情况下,你有

  where B in (select B from TA)

等于

  -- 1. null in (...) is null, not true
  -- 2. we have not empty TA 
  where (B is not null) and Exists (select 1 from TA)

最后

  select *
    from TB 
   where B in (select C   -- wrong: there's no field C in TB as well as in TA
                 from TA)

【讨论】:

【参考方案2】:

您可以在in 子句的查询中使用“外部”表中的列。对于外部表中的每一行,从内部表中选择该行的 column_name 的值(类似于选择文字值)。由于与外部查询中的行的column_name值相同,因此它们显然相等,因此满足条件并返回该行。

避免此类错误的一个很好的防御做法是完全限定您正在查询的列(最好使用表别名),这样查询就会出错而不是返回您不期望的内容:

SELECT *
FROM   other_table ot
WHERE  ot.column_name IN (SELECT mt.column_name -- causes error!
                          FROM   my_table mt) 

【讨论】:

以上是关于select * from table where column in (sub query) where sub query return ORA-00904 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Select into Table from Table2 where column in (Subquery)

select * from [table] where min(date) > 某个日期

INSERT <table> (x) VALUES (@x) WHERE NOT EXISTS ( SELECT * FROM <table> WHERE x = @x) 会导

sql 代码:SELECT * FROM table WHERE 列

SELECT * FROM table WHERE column = 1,2,3,4 [重复]

Select into Table from Table2 where column in (Subquer)