2012-09-07 40 views
2

我有3個表如下SQL查詢,以避免環或遊標讀取記錄

Table #1 has column UserId and UserName 

Table #2 has column MenuId and MenuName 

Table #3 has column MappingId, UserId, MenuId 

(在表#3列的用戶ID和MENUID分別具有表#1用戶id和表#2 MENUID外鍵關係。)

我想選擇語句,如果用戶名和MENUNAME組合表#3已經存在,否則它會像假

UserName, MenuName, AllowedDisallowedFlag 

Where 

UserName is Names of User From Table #1 

MenuName is Names of Menu from Table #2 

AllowedDisallowedFlag將是真實的。

有什麼辦法可以在不使用遊標或循環的情況下實現這一點嗎?

+3

是的,正常的SQL方法是使用[joins](http://en.wikipedia.org/wiki/Join_(SQL))。 – Oded

+0

@oded你可以幫我查詢嗎?我的意思是如何使用連接實現這個? –

回答

3

你需要的東西是這樣的:

SELECT DISTINCT 
    UserName, 
    MenuName, 
    CASE WHEN Table3.UserID IS NULL THEN 0 ELSE 1 END AS Allowed 
    FROM Table1 
    CROSS JOIN Table2 
    LEFT JOIN Table3 ON Table1.UserID = Table3.userID 
    AND Table3.MenuID = Table2.MenuID 

這裏是一個SQL Fiddle

+0

+1雖然你也沒有考慮到用戶和menu_的組合實際上是什麼意思。 –

+0

是它的工作原理唯一的變化是在case語句 SELECT DISTINCT 用戶名, MENUNAME, **允許= ** CASE WHEN Table3.UserID爲null,則0 ELSE 1 **完** FROM表1 CROSS JOIN表2 LEFT JOIN表3 ON Table1.UserID = Table3.userID AND Table3.MenuID = Table2.MenuID –

+0

@TimSchmelter我想,如果有表3中沒有記錄,如用戶A + B菜單這意味着B菜單不允許用戶A,所以標誌應該是0.你認爲OP有其他邏輯嗎?這似乎是一個簡單的menurigth存儲問題。 –

0

請嘗試查詢(我還沒有執行):

SELECT 
(SELECT UserName FROM Table#1 T1 WHERE T1.UserId=T2.UserID) AS UserName, 
(SELECT MenuName FROM Table#2 T3 WHERE T3.MenuId=T2.MenuID) AS MenuName, 
(CASE WHEN ISNULL(UserId,'')<>'' AND ISNULL(MenuID,'')<>'' THEN TRUE ELSE FALSE END) AS AllowedDisallowedFlag FROM Table#3 T2 

注:提供的用戶名和菜單ID是獨特的。

+1

不讓我把這樣的問題像這樣我想在第一列中的第二列菜單名稱中的所有用戶名(全部存在於表#1中)(表2中針對每個用戶名存在的所有菜單)以及第三列如果用戶名映射到表#3中的菜單ID,則返回true否則爲false –

+0

請嘗試此操作:select t1.UserName,t2.MenuName, (CASE WHEN(SELECT COUNT(*)FROM Table_3 t3 where t3.UserID = t1。 UserID和t3.MenuID = t2.MenuID)> 0 then 1 else 0 end)AS AllowedDisallowedFlag 從Table_1 t1,Table_2 t2' – TechDo

+0

是這個給我所需的輸出 –