【问题标题】:ORA-00904: invalid identifier in subqueryORA-00904: 子查询中的标识符无效
【发布时间】:2014-03-02 02:06:43
【问题描述】:

为什么下面的查询在 oracle 中不起作用?

select * from ENTITY_OWNERSHIP EO
where 
(select count (*) 
    from (
      select USER_ID 
      from ENTITY_OWNERSHIP 
      where ENTITY_OWNERSHIP.ENTITY_ID = EO.ENTITY_ID
    )
) > 0

它产生“ORA-00904:“EO”。“ENTITY_ID”:无效标识符”。但是,当我将 EO.ENTITY_ID 替换为精确值时,例如 10181,它就可以工作了。

更新: 完整的查询如下所示:

select * from ENTITY_OWNERSHIP EO
where 
(select count (*) 
    from (
      select USER_ID 
      from ENTITY_OWNERSHIP 
      where ENTITY_OWNERSHIP.ENTITY_ID = EO.ENTITY_ID

      intersect

      select distinct group_id
      from USERS.GROUPS 
      start with GROUP_ID in (select GROUP_ID from USERS.LK_GROUPS where USER_ID=10001)
      connect by prior PARENTGROUP_ID=GROUP_ID 
    )
) > 0

【问题讨论】:

  • 过滤条件不做任何事情。您正在计算entity_ownership 中存在的行数——但您正在从同一个表中进行选择。对于原始表中的每一行,count(*) 必须至少为 1。
  • 我举了一个简化的例子,这是我的错。请查看更新版本。

标签: sql oracle


【解决方案1】:

我认为您可以改用exists

select *
from ENTITY_OWNERSHIP EO
where exists (
      select USER_ID 
      from ENTITY_OWNERSHIP 
      where ENTITY_OWNERSHIP.ENTITY_ID = EO.ENTITY_ID

      intersect

      select distinct group_id
      from USERS.GROUPS 
      start with GROUP_ID in (select GROUP_ID from USERS.LK_GROUPS where USER_ID=10001)
      connect by prior PARENTGROUP_ID=GROUP_ID 
    );

【讨论】:

  • 非常感谢,您的回答很有帮助。给我点赞。
【解决方案2】:

如果你按照基础,CORRELATED Subquery 可以访问相关表。但是当有 INNER subquery 时,INNER Query 将尝试先执行......因此无法访问条件中的另一个表,因为它们在那个时间点不可用。 理解这一点的捷径是..如另一个答案中所述..

SELECT A.* FROM TABLE A
WHERE EXISTS
 (SELECT 'X' FROM TABLE B WHERE B.ID = A.ID)

现在,相关子查询可以访问 A。

select * from ENTITY_OWNERSHIP EO
where 
EXISTS
(
      select USER_ID 
      from ENTITY_OWNERSHIP 
      where ENTITY_OWNERSHIP.ENTITY_ID = EO.ENTITY_ID

      intersect

      select distinct group_id
      from USERS.GROUPS 
      start with GROUP_ID in (select GROUP_ID 
                               from USERS.LK_GROUPS
                             where USER_ID=10001)
      connect by prior PARENTGROUP_ID=GROUP_ID
)

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2023-01-12
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多