sql请求中的标识符无效

l0r*_*c10 2 sql oracle

我有这个SQL请求:

select T1.ID, T2.ID 
from task t1, task t2
join workcase w on W.ID = T1.WORKCASE_ID
where W.ID = 1683964476
and T1.STATE < 501
and T2.STATE = 501
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我有这个错误:

ORA-00904: "T1"."WORKCASE_ID": invalid identifier
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

Tar*_*ryn 6

问题是你正在混合JOIN语法.您正在使用之间的隐式连接(逗号)T1T2再使用的是明确的JOIN语法来加入到workcase表中.

JOIN语法的优先级高于逗号所以当你尝试在连接条件使用它的别名是不可用的.

如果您需要同时使用两者,那么您需要使用:

select T1.ID, T2.ID 
from
(
  select T1.ID, T2.ID, T1.WORKCASE_ID
  from task T1, task T2
  where T1.STATE < 501
    and T2.STATE = 501
) t
inner join workcase w 
  on W.ID = T1.WORKCASE_ID
where W.ID = 1683964476
Run Code Online (Sandbox Code Playgroud)

这将允许隐式连接发生在子查询中,然后您将使用显式连接到workcase表.

或者作为@APC在评论中说明,这也可以写成CROSS JOIN:

select T1.ID, T2.ID 
from task T1
cross join task T2
inner join workcase w 
  on W.ID = T1.WORKCASE_ID
where W.ID = 1683964476
  and T1.STATE < 501
  and T2.STATE = 501
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案 - 我需要撤回我的重复投票.一个更简单的解决方案是用`t1交叉连接t2`替换teh FROM子句中的逗号.它的输入更少,更容易理解查询实际上在做什么.另外,它将所有连接保留在一种语法中. (3认同)