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 表达式是不必要的。