使用联接时查询抛出ORA-00904无效标识符

phi*_*lfo 5 sql oracle

我遇到了一些奇怪的行为,这些行为阻止了我按照自己的方式设置查询。将不胜感激任何想法。如果有任何有关表格的信息会有所帮助,请告诉我。我看了看它们,没有任何东西跳到我身上,这可能导致这种情况,但是我也不知道我在寻找什么。这是行为。

这很好用:

Select * 
From 
    SCHEMA_A.TABLE_A a,
    SCHEMA_B.TABLE_B b,
    SCHEMA_C.TABLE_C c,
    SCHEMA_A.TABLE_D d
Where 
    b.friend_id = c.friend_id
    AND a.group_id = d.group_id
    AND b.group_cd = d.group_cd
Run Code Online (Sandbox Code Playgroud)

但这会返回ORA-00904:b.friend_id = c.friend_id:无效的标识符

Select * 
From 
    SCHEMA_A.TABLE_A a,
    SCHEMA_B.TABLE_B b,
    SCHEMA_A.TABLE_D d
Join 
    SCHEMA_C.TABLE_C c
On
    b.friend_id = c.friend_id
Where 
    a.group_id = d.group_id
    AND b.group_cd = d.group_cd
Run Code Online (Sandbox Code Playgroud)

这将返回ORA-00904:b.group_cd = d.group_cd:无效的标识符

Select * 
From 
    SCHEMA_A.TABLE_A a,
    SCHEMA_B.TABLE_B b
Join 
    SCHEMA_C.TABLE_C c
On
    b.friend_id = c.friend_id
Join 
    SCHEMA_A.TABLE_D d
On 
    a.group_id = d.group_id
    AND b.group_cd = d.group_cd
Run Code Online (Sandbox Code Playgroud)

这再次起作用:

Select * 
From 
    SCHEMA_A.TABLE_A a,
    SCHEMA_B.TABLE_B b
Join 
    SCHEMA_C.TABLE_C c
On
    b.friend_id = c.friend_id
Join 
    SCHEMA_A.TABLE_D d
On
    b.group_cd = d.group_cd
Where  
    a.group_id = d.group_id
Run Code Online (Sandbox Code Playgroud)

Jea*_*ard 4

尝试使用专为同一列名称using设计的关键字join

Select * 
From 
    SCHEMA_A.TABLE_A a,
    SCHEMA_B.TABLE_B b
Join 
    SCHEMA_C.TABLE_C USING(friend_id)
Join 
    SCHEMA_A.TABLE_D d using(group_id)
where b.group_cd = d.group_cd;
Run Code Online (Sandbox Code Playgroud)

还要确保使用正确的用户执行其他查询,因为没有正确权限的用户将抛出invalid identifier

编辑:实际问题是您正在加入TABLE_CTABLE_D但加入条件引用将TABLE_B其更改为

Select * 
From 
    SCHEMA_A.TABLE_A a,
    SCHEMA_A.TABLE_D d,
    SCHEMA_B.TABLE_B b
Join 
    SCHEMA_C.TABLE_C c using(friend_id)
Where 
    a.group_id = d.group_id
    AND b.group_cd = d.group_cd;
Run Code Online (Sandbox Code Playgroud)

对其他查询应用相同的逻辑,在进行联接时,您不会联接到一组表,而是联接到子句中提到的最后一个表,from因此它无权访问TABLE_B.

对于可能出现invalid identifier错误的其他人,请确保您的数据库不区分大小写,否则请确保使用正确的大小写。