ORACLE 为什么别名 COUNTER 在我的案例计数器 > 0 中是无效 ID?
ORACLE Why alias COUNTER is an invalid ID in my case counter > 0?
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
counter
别名不可用于同一级别的 select
子句,因为在评估 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;
请注意,我还删除了您使用现代显式内部连接的旧式逗号连接。这是目前编写连接的首选方式。
使用子查询作为列别名在同一个 select
中不起作用
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
内联别名不支持在 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
我猜你想要:
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;
备注:
- 使用 table 别名来标识 table 并限定所有列名。
- 从不 在
FROM
子句中使用逗号。
- 在这种情况下,您似乎需要一个相关的子查询,而不是
JOIN
.
else
对于 case
表达式是不必要的。
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
counter
别名不可用于同一级别的 select
子句,因为在评估 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;
请注意,我还删除了您使用现代显式内部连接的旧式逗号连接。这是目前编写连接的首选方式。
使用子查询作为列别名在同一个 select
中不起作用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
内联别名不支持在 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
我猜你想要:
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;
备注:
- 使用 table 别名来标识 table 并限定所有列名。
- 从不 在
FROM
子句中使用逗号。 - 在这种情况下,您似乎需要一个相关的子查询,而不是
JOIN
. else
对于case
表达式是不必要的。