Псевдоним, не распознанный в операторе обращения к подзапросу SQL

#sql #sql-server #case #where #alias

#sql #sql-сервер #случай #где #псевдоним

Вопрос:

У меня есть следующий запрос, который выполняется нормально, когда Where не заполнен, но у меня возникают трудности с получением правильных ссылок для данных в where.

Код приведен ниже:

 SELECT g.Id as Id,                                                                                               
       g.Printed as Printed,
       g.CreatedDate as CreatedDate , 

       case when (                            
           Select Count(Distinct custSubGA.CustomerId) from PickingAssignment_PickingAssignmentUserGroup custSubG 
              join PickingAssignment custSubGA on custSubGA.Id = custSubG.PickingAssignmentId
                      join Customer custSub2C on custSubGA.CustomerId = custSub2C.Id
                            where custSubG.PickingAssignmentUserGroupId = Max(g.Id)
                    ) > 1 
                    then 'Multiple' 
       else (
           Select Max(custSub2C.Name) from PickingAssignment_PickingAssignmentUserGroup custSub2G 
               join PickingAssignment custSub2GA on custSub2G.PickingAssignmentId = custSub2GA.Id                               
               join Customer custSub2C on custSub2GA.CustomerId = custSub2C.Id
               where custSub2G.PickingAssignmentUserGroupId = Max(g.Id) 
       ) end  as CustomerName 

from PickingAssignmentUserGroup g  
where   CustomerName like 'exet%'  
 

Я также пытался использовать » где custSub2C.Name например, «exet%», и это тоже не сработало. Многосоставный идентификатор custSub2C.Name не мог быть связан — вот что я получаю от этого.

Это первый раз, когда я пытаюсь использовать операторы case в SQL, поэтому есть вероятность, что я делаю это очень неправильно.

Любая помощь была бы фантастической. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответ №1:

Вы не можете использовать псевдоним столбца в where инструкции того же уровня. В большинстве баз данных вы бы просто использовали подзапрос:

 select *
from (SELECT g.Id as Id, g.Printed as Printed, g.CreatedDate as CreatedDate , 
             case when (Select Count(Distinct custSubGA.CustomerId)
                        from PickingAssignment_PickingAssignmentUserGroup custSubG join
                             PickingAssignment custSubGA
                             on custSubGA.Id = custSubG.PickingAssignmentId join
                             Customer custSub2C
                             on custSubGA.CustomerId = custSub2C.Id
                        where custSubG.PickingAssignmentUserGroupId = Max(g.Id)
                    ) > 1 
                    then 'Multiple' 
                  else (Select Max(custSub2C.Name)
                        from PickingAssignment_PickingAssignmentUserGroup custSub2G join 
                             PickingAssignment custSub2GA
                             on custSub2G.PickingAssignmentId = custSub2GA.Id join                           
                             Customer custSub2C
                             on custSub2GA.CustomerId = custSub2C.Id
                        where custSub2G.PickingAssignmentUserGroupId = Max(g.Id) 
                       )
             end  as CustomerName
      from PickingAssignmentUserGroup g  
     ) t
where   CustomerName like 'exet%'  
 

Ответ №2:

Как уже указывал Гордон, псевдонимы столбцов разрешаются после WHERE , но также возможно переместить подзапросы из в CASE в FROM и, поскольку единственным отличием является поле в SELECT , объединить их.

 SELECT g.Id as Id,
       g.Printed as Printed,
       g.CreatedDate as CreatedDate , 

       CASE WHEN CM.CustomerCount > 1 THEN 'Multiple' 
            ELSE CM.Name 
       END as CustomerName

FROM   PickingAssignmentUserGroup g
       OUTER APPLY (
             SELECT Max(custSub2C.Name) Name
                  , Count(Distinct custSubGA.CustomerId) CustomerCount
             FROM   PickingAssignment_PickingAssignmentUserGroup custSub2G 
                    INNER JOIN PickingAssignment custSub2GA 
                       ON custSub2G.PickingAssignmentId = custSub2GA.Id
                    INNER JOIN Customer custSub2C 
                       ON custSub2GA.CustomerId = custSub2C.Id
             WHERE  custSub2G.PickingAssignmentUserGroupId = Max(g.Id)) CM
WHERE  CM.Name like 'exet%' AND CM.CustomerCount = 1