2013-02-28 70 views
1

我有一個查詢,拿回商店的列表,用戶可以訪問。 如果用戶是內部工作人員,他們可以自動訪問所有商店。的SQL Server 2008R2 WHERE子句合併兩個查詢

在工作人員的表,這是通過一個稱爲內部coloumn其由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 2013-02-28 14:29:35

+0

通過一個工作示例改進了答案 - http://www.sqlfiddle.com/#!3/aafa5/16/0 – 2013-02-28 14:39:55

回答

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; 

小提琴here