【发布时间】:2017-11-16 21:14:38
【问题描述】:
我的某一列的值如下所示:
ID | userPerms | Name | DOB
-----+-----------+-----------+----------
5985 |1,3,4 |Bob Barker |12/12/1923
895 |1,2 |Bill Gates |10/14/1955
5897 |1,2,4 |Steve Jobs |02/24/1955
该列是 userPerms 列。
我需要能够Inner Join与与这些数字关联的userPerm 表。
我的查询目前是:
SELECT
uT.employeeID + '|' + uT.lastFirstMiddle + '|' + uT.ntName + '|' + uT.email + '|' +
uT.firstName + '|' + uT.lastName + '|' + uT.active + '|' + uT.userPerms + '|' +
uT.userPermPages
FROM
usersTbl AS uT
INNER JOIN
usersPermissions AS uP ON uP.id = uT.userPerms
WHERE
uT.id = 1
由于数据中包含逗号,因此它自然不会起作用。
所以我在输出中寻找什么:
ID | userPerms | Name | DOB
-----+------------------+-----------+------------
5985 |Read,Upload,Admin |Bob Barker |12/12/1923
895 |Read,Write |Bill Gates |10/14/1955
5897 |Read,Write,Admin |Steve Jobs |02/24/1955
有谁知道如何拆分这些,以便 inner join 能够按设计工作?
更新 1
我得到了它的工作,但是:
它不会将 userPerms 合并到原始字符串中
SELECT
uT.employeeID + '|' + uT.lastFirstMiddle + '|' + uT.ntName + '|' +
uT.email + '|' + uT.firstName + '|' + uT.lastName + '|' + uT.active,
(
SELECT
',' + uP.type
FROM
usersPermissions AS uP
WHERE
',' + uT.userPerms + ','
LIKE
'%,' + cast(uP.id AS nvarchar(20)) + ',%'
FOR
XML PATH(''), TYPE
).value('substring(text()[1], 2)', 'varchar(max)') AS userPerms,
(
SELECT
',' + uP.name
FROM
pagePermissions AS uP
WHERE
',' + uT.userPerms + ','
LIKE
'%,' + cast(uP.id AS nvarchar(20)) + ',%'
FOR
XML PATH(''), TYPE
).value('substring(text()[1], 2)', 'varchar(max)') AS userPermPages
FROM
usersTbl as uT
WHERE
uT.id = '1';
【问题讨论】:
-
使用split函数和cross-apply怎么样?然后将结果转换为 CSV?
-
你能修复数据结构吗?存储分隔数据违反了 1NF,并导致令人难以置信的痛苦。
-
而且这种事情真的应该由角色而不是每个用户来处理。您将权限分配给角色,然后将用户分配给角色。让事物保持整洁。
-
SQL Server 2016 提供
STRING_SPLIT()和STRING_AGG()使用第一个和CROSS APPLY将您的ID 作为派生表,然后使用JOIN绑定您的值,最后使用第二个重新连接结果。 -
@danihp 太真实了! Codd 保存 quee...ry .-D
标签: sql-server tsql sql-server-2016