关于许多关系的问题

时间:2009-12-11 13:43:07

标签: sql

我有一个非常简单的问题,虽然我有一个解决方案,但我想知道其他人如何有效地解决它。

假设我们有一个User表和一个Role表。每个用户可以有多个角色,反之亦然(多对多关系)。此关系存储在交叉表中:UserRoleMapper(UserID,RoleID)。

现在我必须获得所有用户的列表,以及他们的角色名称。但是如果我有一个属于3个不同角色的用户,我将在列表中获得该用户3次。处理此类方案的最佳方法是什么?一种简单的方法是首先获取所有用户,然后触发另一个查询(另一个命中数据库)以获得各自的角色。有没有比这更好的其他解决方案?

感谢,

3 个答案:

答案 0 :(得分: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中处理此问题取决于您。您可以决定使用一个查询来连接用户的角色,或者仅在需要时使用特定用户的延迟加载角色。

答案 1 :(得分:0)

只要您只想为每个用户创建一行 - 并为所有可能的角色进行字符串连接,您将需要查看使用“Cross Apply”和“For XML Path” - 这一切都可以完成使用单个查询。

大量示例herehere.

答案 2 :(得分: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