2009-12-11 145 views
2

雖然我有一個解決方案,但我想知道其他人如何有效解決這個問題,但我有一個非常簡單的問題。關於多關係的問題

假設我們有一個用戶表和一個角色表。每個用戶可以有多個角色,反之亦然(多對多關係)。這個關係存儲在一個交叉表中:UserRoleMapper(UserID,RoleID)。

現在我必須得到所有用戶的列表,以及他們的角色名稱。但是如果我有一個屬於3個不同角色的用戶,我會在列表中獲得該用戶3次。處理這種情況的最佳方式是什麼?一個簡單的方法是首先獲取所有用戶,然後再觸發另一個查詢(另一個命中數據庫)以獲得其各自的角色。還有其他解決方案比這更好嗎?

感謝,

回答

1

正確的做法是,如果用戶有3個角色3個結果應爲用戶返回他們的東西,如下面的查詢

SELECT u.username, r.rolename 
FROM user u 
INNER JOIN 
user_role ur 
ON 
u.userid = ur.userid 
INNER JOIN 
role r 
ON 
ur.roleid = r.roleid 

我的角色假設你的問題是指提供這些信息?你如何在UI中處理這個問題取決於你。您可以決定使用爲用戶連接角色的查詢,或僅在需要時爲特定用戶使用延遲加載角色。

0

只要你只是想爲每個用戶單行 - 和字符串concatination他們所有可能的角色,你要看看使用「跨應用」和「對於XML路徑' - 這可以使用單個查詢來完成。

的例子here大量和here.

0

您可以嘗試使用角色ID或名稱的逗號分隔列表(如果需要)。

這將取決於您使用的分貝。

你可以使用連接函數,組連接或wile循環。

我發現一個有趣的方式來做到這一點使用SQL Server 2005

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(50) 
) 
INSERT INTO @Table (ID,Val) SELECT 1, 'A' 
INSERT INTO @Table (ID,Val) SELECT 1, 'B' 
INSERT INTO @Table (ID,Val) SELECT 1, 'C' 
INSERT INTO @Table (ID,Val) SELECT 2, 'B' 
INSERT INTO @Table (ID,Val) SELECT 2, 'C' 

--Concat 
SELECT t.ID, 
     (
      SELECT tIn.Val + ',' 
      FROM @Table tIn 
      WHERE tIn.ID = t.ID 
      FOR XML PATH('') 
     ) 
FROM @Table t 
GROUP BY t.ID