首页 > 解决方案 > 给定 2 个表,如何将它们合并到一个视图中?

问题描述

给定以下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|

我如何将它们合并到一个视图中,以便我们最终得到这样的结果,其中 orgcodes 组合在 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 个组中的所有组织代码在最终视图中合并为 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|

标签: sql-serversql-server-2017

解决方案


组织代码在 1 个匹配的用户 ID 下组合在哪里?

您需要使用STRING_AGG仅在 SQL Server 2017 或更高版本中可用的

此查询还使用TRIM()输入[Org Codes]值来帮助防止'||'在现有字符串连接在一起时出现在输出中。

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 层中的数据进行非规范化。


推荐阅读