sql-server - T-SQL 合并两个逗号分隔的列

标签 sql-server t-sql merge

我正在尝试将一个表合并到另一个表(我们将其称为 Stage 和 Prod)中,以控制用户及其权限。我的最终结果应该是一个单一的 Prod 表,它将每个用户 ID 的权限从 Stage 组合到 Prod 中。我遇到的问题是,这些表是由外部供应商设计的,并且在一个逗号分隔的列中包含多条信息。

舞台可能如下所示:

Userid     | Permissions
----------------------------------------------------------------
1          | schedule,upload,test,download,admin
2          | test,upload
3          | download

产品:

Userid     | Permissions
----------------------------------------------------------------
1          | test,admin,schedule,download,upload
2          | admin
3          | download,upload

合并后,用户 ID 应该拥有来自 Stage 的权限以及 Prod 中的权限。然而,当权限是逗号分隔的字符串时解决这个问题让我束手无策。

在下面的最终结果中,用户 ID 1 的权限保持不变,因为它们在 Stage 中与在 Prod 中相同,只是顺序不同。 用户 ID 2 已将其阶段权限添加到他的产品中,因为他还没有这些权限。 用户 ID 3 的 Prod 权限未更改,因为其 Stage 权限已包含在内。

结果:

Userid     | Permissions
----------------------------------------------------------------
1          | test,admin,schedule,download,upload
2          | admin,test,upload
3          | download,upload

有什么办法可以做到这一点吗?希望这有一定道理,但如果有任何更多信息可能有帮助,我很乐意尝试提供。感谢您提供的任何帮助。

最佳答案

有趣的是,这是 MSSQLTips blog 上的一个讨论主题。通过 Aaron Bertrand 。借用他的代码,您可以创建完成以下工作所需的 Numbers 表和字符串拆分/重组函数。如果您计划经常这样做并且坚持使用所显示的架构,那么这就是您要走的路。

/*Create Test Data

create table StagePermissions (UserID int, [Permissions] nvarchar(max));
create table ProdPermissions (UserID int, [Permissions] nvarchar(max));

insert StagePermissions values
(1,'schedule,upload,test,download,admin'),
(2,'test,upload'),
(3,'download')

insert ProdPermissions values
(1,'test,admin,schedule,download,upload'),
(2,'admin'),
(3,'download,upload')
*/

select sp.UserID, dbo.ReassembleString(sp.Permissions+','+pp.Permissions,',',N'OriginalOrder') MergedPermissions
from StagePermissions sp
    join ProdPermissions pp on pp.UserID=sp.UserID

关于sql-server - T-SQL 合并两个逗号分隔的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37710179/

相关文章:

sql - 如果我想查找 SQL Server 中引用对象的内容,搜索 syscomments 是否全面?

sql - 如何在 SSMS 中生成多个 Alter 脚本

sql - 来自带有子级别的 SQL 查询的 JSON

sql-server - sql server 如何在有多个选项的更新语句中选择值?

sql - 连接 2 个表,一个带破折号的 GUID,一个不带破折号

SQL 将具有相同节点的 XML 转换为数据集

javascript - 选择 rxjs 中重复的第一项

merge - SPSS - 合并具有 ID 变量重复案例和新案例/变量的文件

java - JPA事务回滚重试和恢复: merging entity with auto-incremented @Version

php - 从字符串中获取符号列表