首页 > 解决方案 > Oracle 子查询无效标识符

问题描述

我无法弄清楚这个查询有什么问题:

select * from inv_srv_inst inst, 
(select srvc.li_srv_cat_id from inv_li_srv_cat_srv srvc where srvc.srv_id = inst.service_id) li_srv_cat_id
where id in (37336558,37343286)

错误信息:

ORA-00904: "INST"."SERVICE_ID": 无效标识符 00904. 00000 - "%s: 无效标识符"

标签: sqloracle

解决方案


ORA-00904: "INST"."SERVICE_ID": 标识符无效

您收到此错误是因为 INV_SRV_INST 不在内联视图的范围内。如果您使用的是 12c 或更高版本,您可以使用 LATERAL 关键字解决此问题,这允许我们将谓词推送到子查询中:

select * 
from inv_srv_inst inst, 
lateral (select srvc.li_srv_cat_id 
         from inv_li_srv_cat_srv srvc 
         where srvc.srv_id = inst.service_id) li_srv_cat_id
where id in (37336558,37343286)

尽管必须要问,为什么选择内联视图而不是仅仅连接两个表?

select inst.* 
       ,srvc.li_srv_cat_id 
from inv_srv_inst inst
inner join  inv_li_srv_cat_srv srvc 
on srvc.srv_id = inst.service_id
where inst.id in (37336558,37343286)

这是关于 db<>fiddle 的演示


推荐阅读