我遇到了一些奇怪的行为,这些行为阻止了我按照自己的方式设置查询。将不胜感激任何想法。如果有任何有关表格的信息会有所帮助,请告诉我。我看了看它们,没有任何东西跳到我身上,这可能导致这种情况,但是我也不知道我在寻找什么。这是行为。
这很好用:
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)
尝试使用专为同一列名称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_C,TABLE_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错误的其他人,请确保您的数据库不区分大小写,否则请确保使用正确的大小写。