给定以下ADuser表:
AD Group UserID
Group1 User1
Group2 User2
Group3 User1
Group3 User3
和Group_Access表:
AD Group Org Codes
Group1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|
Group2 123_KL|Z45557|f908L_P|
Group3 12345|
我如何将它们合并到一个 View 中,以便我们最终得到这样的结果,其中组织代码组合在 1 个匹配的用户 ID 下?
UserID Org Codes
User1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|12345|
User2 123_KL|Z45557|f908L_P|
User3 12345|
请注意,由于 User1 属于多个组,即 Group1 和 Group3,因此 user1 这 2 个组中的所有组织代码在最终 View 中都合并到 1 中,并附加了额外的 12345|
组织代码
到目前为止我尝试过的:
CREATE VIEW UserOrgCodesView
AS SELECT ADuser.UserID, Group_Access.[Org Codes]
FROM ADuser
INNER JOIN Group_Access ON ADuser.[AD Group]=Group_Access.[AD Group];
但是这已经产生了以下结果
UserID Org Codes
User1 M500_ABC|1098|123_KL|Z45557|f908L_P|234G|12345|
User2 123_KL|Z45557|f908L_P|
User1 12345|
User3 12345|
最佳答案
where the orgcodes are combined under 1 matching userid?
You'll need to use STRING_AGG
which is only available in SQL Server 2017 or later .
此查询还在输入[组织代码]
值上使用TRIM()
,以帮助防止'||'
出现在输出中当现有字符串连接在一起时。
SELECT
u.UserId,
STRING_AGG( TRIM( '|' FROM g.[Org Codes] ), '|' ) AS [Org Codes]
FROM
ADuser AS u
INNER JOIN Group_Access AS g ON u.[AD Group] = g.[AD Group]
GROUP BY
u.UserId;
也就是说,像这样对数据进行非规范化通常是一个坏主意。您应该向客户端返回面向行的数据,并且仅对 UI 层中的数据进行非规范化。
关于sql-server - 给定2个表,如何将它们合并到 View 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62827060/