Случай SQL внутри в предложении - PullRequest
0 голосов
/ 13 октября 2018

Что не так с запросом?

select * 
from ERP.dbo.Table 
where storeID in (case 
                     when @Designation = 80 
                        then 
                           (select storeID 
                            from ERP.dbo.Store 
                            where companyID = @CompanyID 
                              and isMonitoringAvailable = 1  
                              and storeID = ISNULL(@StoreId, storeID)) 
                        else 
                           (select storeID 
                            from ERP.dbo.EmployeeRole 
                            where employeeID = @EmployeeId 
                              and storeID = ISNULL(@StoreId,storeID) )  
                 end)

Я получаю эту ошибку:

Сообщение 512, Уровень 16, Состояние 1, Строка 46
Подзапрос возвратил больше, чем1 значениеЭто недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

CASE ожидает выражений , отсюда и ошибка.Альтернативой с точки зрения производительности является использование оператора UNION ALL, например, такого:

select * from ERP.dbo.EmployeeRole 
where @Designation=80 AND storeID in (  
    select storeID 
    from ERP.dbo.Store 
    where companyID=@CompanyID and isMonitoringAvailable=1  
    and storeID=ISNULL(@StoreId,storeID)
)
UNION ALL
select * from ERP.dbo.EmployeeRole 
where @Designation<>80 AND storeID in (  
    select storeID 
    from ERP.dbo.EmployeeRole 
    where employeeID=@EmployeeId 
    and storeID=ISNULL(@StoreId,storeID)
)

. Другой подход - использовать IF-ELSE, но лучше будет UNION ALL.

0 голосов
/ 13 октября 2018

Вы можете переписать ваше условие следующим образом:

select * from ERP.dbo.EmployeeRole where
  ( storeID in (          
  (select storeID 
     from ERP.dbo.Store 
    where companyID=@CompanyID and isMonitoringAvailable=1  
      and storeID=ISNULL(@StoreId,storeID)
        ) and @Designation=80
    ) Or
   storeID  in (Select storeID 
           from ERP.dbo.EmployeeRole 
          where employeeID=@EmployeeId 
            and storeID=ISNULL(@StoreId,storeID)
               )

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

...