ORACLE Почему псевдоним COUNTER является неверным идентификатором в моем счетчике дел> 0? - PullRequest
0 голосов
/ 26 февраля 2019
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

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

Полагаю, вы хотите:

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.
0 голосов
/ 26 февраля 2019

использовать подзапрос, так как псевдоним столбца не работает в том же 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
0 голосов
/ 26 февраля 2019

встроенный псевдоним не поддерживает подзапрос использования оракула

    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
0 голосов
/ 26 февраля 2019

Псевдоним 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;

Обратите внимание, что я также удалил ваше запятое соединение в стиле старой школы с современным явным внутренним соединением.Это предпочтительный способ написания объединения в наши дни.

...