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 子句中使用逗号。 在这种情况下,您似乎需要一个相关的子查询,而不是 JOINelse 对于 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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以键入别名函数并在不强制转换的情况下使用它们?

为啥 this.setState 在我的情况下有效

为啥转换在我的情况下不起作用

为啥 `async/await` 在我的情况下不起作用?

为啥 setState() 在我的情况下不能在 React 中工作?

为啥在我的情况下快速排序总是比冒泡排序慢?