ORACLE 为啥在我的情况下,别名 COUNTER 是无效 ID,计数器 > 0?
Posted
技术标签:
【中文标题】ORACLE 为啥在我的情况下,别名 COUNTER 是无效 ID,计数器 > 0?【英文标题】:ORACLE Why alias COUNTER is an invalid ID in my case counter > 0?ORACLE 为什么在我的情况下,别名 COUNTER 是无效 ID,计数器 > 0? 【发布时间】:2019-02-26 13:12:47 【问题描述】:select demvbtn,
deomsch,
(select count(*)
from drmvctl a, drmvtbg b
where a.deblgty = b.demvbtn
and a.deblgty = :demvbtn) as counter,
case
when counter > 0
then 'u'
else ''
end ctrl
from drmvtbg
where demvbtn = :demvbtn
【问题讨论】:
SQL 就是这样工作的。您不能在同一select
中重复使用列别名。您需要使用子查询、CTE 或横向连接。
【参考方案1】:
counter
别名不可用于同一级别的 select
子句,因为在评估该选择时,尚未计算 counter
。这里的一个解决方案是使用 CTE,它首先计算 counter
别名:
with cte as (
select demvbtn, deomsch,
(select count(*) from drmvctl a inner join drmvtbg b
on a.deblgty = b.demvbtn where a.deblgty = :demvbtn) as counter
from drmvtbg
where demvbtn = :demvbtn
)
select demvbtn, deomsch, counter,
case when counter > 0 then 'u' else '' end ctrl
from cte;
请注意,我还使用现代显式内部连接删除了您的老式逗号连接。这是目前编写联接的首选方式。
【讨论】:
【参考方案2】:我想你想要:
select demvbtn, deomsch, counter,
(case when counter > 0 then 'u'
end) as ctrl
from (select dt.demvbtn, dt.deomsch,
(select count(*)
from drmvctl dc
where dc.deblgty = dt.demvbtn and
dc.deblgty = dt.demvbtn
) as counter
from drmvtbg dt
where dt.demvbtn = :demvbtn
) d;
注意事项:
使用表别名来标识表并限定所有列名。 永远不要在FROM
子句中使用逗号。
在这种情况下,您似乎需要一个相关的子查询,而不是 JOIN
。
else
对于 case
表达式来说是不必要的。
【讨论】:
【参考方案3】:使用子查询作为列别名在同一个选择中不起作用
select *,
case
when counter > 0
then 'u'
else ''
end ctrl from
(
select demvbtn,
deomsch,
(select count(*)
from drmvctl a join drmvtbg b
on a.deblgty = b.demvbtn
where a.deblgty = :demvbtn) as counter
from drmvtbg
where demvbtn = :demvbtn
)A
【讨论】:
【参考方案4】:oracle 中不支持内联别名使用子查询
select emvbtn,
deomsch,case
when counter > 0
then 'u'
else ''
end ctrl
from (select demvbtn,
deomsch,
(select count(*)
from drmvctl a join drmvtbg b
on a.deblgty = b.demvbtn
where a.deblgty = :demvbtn) as counter
from drmvtbg
where demvbtn = :demvbtn
) t
【讨论】:
以上是关于ORACLE 为啥在我的情况下,别名 COUNTER 是无效 ID,计数器 > 0?的主要内容,如果未能解决你的问题,请参考以下文章