sql-server - 给定2个表,如何将它们合并到 View 中?

标签 sql-server sql-server-2017

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

相关文章:

sql - 在非空列上插入后触发

sql - 关于数据库变更的通知

java - 执行更新被阻止

sql - SYSDATETIME 向后移动

sql - 存储过程 - 从带有联接的表中删除

tsql - T-SQL-每个项目的运行总计

sql-server - Varchar 和 nvarchar 隐式转换为 int 的不同之处

sql-server - SQL Azure 有关聚集索引和删除约束的问题

sql - 在最近一次购买之前选择最近一次购买

sql - 查找仅与两个值之一匹配的行