2014-02-05 77 views
4

爲什麼下面的查詢在oracle中不起作用?ORA-00904:子查詢中的無效標識符

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然後它可以工作。

UPDATE: 完整的查詢看起來像:

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 
+0

過濾條件不起任何作用。您正在對'entity_ownership'中存在的行進行計數 - 但您是從同一張表中進行選擇。對於原始表中的每一行,「count(*)」必須至少爲1。 –

+0

我給了一個簡單的例子,這是我的錯。請參閱更新的版本。 – ako

回答

4

如果你去的基礎,一個相關Subquery先後獲得了相關表格。但是當有一個INNERsubquery,該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 
) 
+0

請參閱示例的更新版本。 – ako

+0

@ako我更新了..剛纔! –

+0

感謝您的好解釋和工作示例。 – ako

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

非常感謝,你的回答很有幫助。 Upvote從我。 – ako