2013-02-28 2 views
1

У меня есть запрос, который возвращает список магазинов, к которым пользователь имеет доступ. Howerver, если пользователь является внутренним сотрудником, у них автоматически есть доступ ко всем магазинам.SQL Server 2008R2 Where Clause для слияния двух запросов

В штатном расписании это обозначается coloumn под названием Internal, который представлен 1 для внутреннего персонала и 0 для не внутреннего персонала.

В настоящее время существует сохраненная процедура, которая получает список магазинов для пользователя, в котором передается идентификатор пользователя. Сохраненная процедура похожа на приведенную ниже. Поэтому я хочу выяснить, как присоединиться к запросу в один.

DECLARE @IsInternal bit 

    SELECT @IsInternal = Staff.Internal FROM Staff WHERE Staff.StaffId = @userId 

IF(@IsInternal = 0) 
    BEGIN 
     SELECT DISTINCT Store.Id, Store.Name, 
     FROM 
     Store JOIN StaffAccess ON StaffAccess.StoreID = Store.StoreId 
       JOIN Staff ON StaffAccess.StaffId= Staff.StaffId 
     WHERE 
     StaffAccess.StaffID = @userId 
     ORDER BY 
      Store.Name 
    END 
ELSE 
    BEGIN 
     SELECT DISTINCT Store.Id,Store.Name, 
     FROM Store 
     ORDER BY Store.Name 
    END 

Извините, что я должен был включить стол для персонала. Если я запускаю ниже это возвращает все магазины для пользователя, который не является внутренний персонал

SELECT DISTINCT 
     Store.Id, 
     Store.Name, 

    FROM 
     Store 
      JOIN StaffAccess ON StaffAccess.StoreID = Store.StoreId 
      JOIN Staff on Staff.Internal= 1 OR (StaffAccess.StaffID = @userId  AND StaffAccess.StaffId = Staff.StaffId) 

    ORDER BY 
     Store.Name 
+0

Можете ли вы прочитайте свой собственный код с этим путаным отступом? Мне трудно даже увидеть, где начинаются и заканчиваются заявления. – usr

+0

Улучшен ответ с помощью рабочего примера - http://www.sqlfiddle.com/#!3/aafa5/16/0 –

ответ

2

Вы можете иметь этот простой запрос, который решает ваши требования

SELECT DISTINCT 
    Store.storeid, 
    Store.Name 
FROM 
    Store JOIN Staff ON Staff.StaffID = @UserId 
    AND (Staff.Internal = 1 OR 
     Staff.StoreID = Store.StoreId) 
ORDER BY 
    Store.Name; 

Fiddle here

Смежные вопросы