sql-server - 给定 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|
解决方案
组织代码在 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 层中的数据进行非规范化。
推荐阅读
- javascript - 使用 s3 预签名 url 以角度下载多个文件
- accessibility - 使用 Accessibility Insights for Web 工具快速传递命令时出现“元素具有可聚焦的后代”错误
- rest - Patentsview-API 请求 | CPC-分段端点
- java - 如何在带有 http 请求的 lambda 上对 whenCompleteAsync 进行单元测试?
- next.js - next.js 中的 apollo-client 与 `next-with-apollo` VS next.js 文档常见问题解答中显示的方法(不使用 `getDataFromTree`)
- node.js - open-graph-scraper (NodeJs) 不使用代理返回响应正文
- redux - 使用 apisauce 处理 react-redux 应用程序中的 401 错误
- powershell-4.0 - 网页的 Powershell Web 自动化
- android - 从图库 Android 过滤文档图像
- c# - 添加主机、.crt 和 .key 证书