1
votes

ORACLE Pourquoi l'alias COUNTER est un ID invalide dans mon compteur de cas> 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

1 commentaires

C'est ainsi que fonctionne SQL. Vous ne pouvez pas réutiliser un alias de colonne dans le même select . Vous devez utiliser une sous-requête, un CTE ou une jointure latérale.


4 Réponses :


2
votes

L'alias counter n'est pas disponible pour une utilisation dans la clause select de même niveau, car lorsque cette sélection est évaluée, le compteur n'a pas été calculé. Une solution ici consiste à utiliser un CTE qui calcule d'abord le terme d'alias 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;

Notez que j'ai également supprimé votre jointure de virgule de style old school avec un intérieur explicite moderne joindre. C'est la manière préférée d'écrire une jointure de nos jours.


0 commentaires

1
votes

utiliser la sous-requête comme alias de colonne ne fonctionne pas dans le même 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 commentaires

1
votes

L'alias en ligne ne prend pas en charge dans la sous-requête Oracle Use

    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 commentaires

1
votes

Je suppose que vous voulez:

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;

Remarques:

  • Utilisez des alias de table pour identifier les tables et qualifier tous les noms de colonnes.
  • Ne jamais utiliser de virgule dans la clause FROM .
  • Dans ce cas, il semblerait que vous souhaitiez une sous-requête corrélée, plutôt qu'une JOIN .
  • Le else n'est pas nécessaire pour l'expression case .


0 commentaires