XMLAGG 在结果中重复
XMLAGG duplicates in results
我正在尝试将 XMLAGG 实施到我用来在 Teradata 中查找用户访问权限的查询中。这是查询:
SELECT
A.RoleName
, B.DatabaseName
--, B.AccessRight
, Trim(Trailing ',' FROM (XmlAgg(Trim(B.AccessRight) || ',' ORDER BY B.AccessRight) (VARCHAR(10000)))) AS AccessRight
FROM DBC.RoleMembers A JOIN DBC.AllRoleRights B
ON A.RoleName = B.RoleName
WHERE Grantee='?your_id'
GROUP BY 1,2
ORDER BY 2,1,3
;
以前我只是 select 注释行 B.AccessRight
并梳理结果,但我想将每个角色的访问权限合并到一行中。
上面的查询确实有效,但偶尔会有重复的行。这是输出的一个简单示例:
+----------+--------------+-------------+
| RoleName | DatabaseName | AccessRight |
+----------+--------------+-------------+
| Role1 | dbA | CM, CT, CV |
+----------+--------------+-------------+
| Role2 | dbB | R, R, R, R | <-- Problematic column
+----------+--------------+-------------+
| Role3 | dbC | E, R |
+----------+--------------+-------------+
我已尝试通过在我的 XMLAGG 查询中添加 DISTINCT 来解决此问题,正如我在 several other solutions 此处看到的那样,但我似乎无法自行解决。
DBC.AllRoleRightsV 包括数据库、table 或列级别的权限。因此,您可能会在数据库级别获得重复项。
join ( select distinct databasename, accessright from DBC.AllRoleRightsV ) as B
可能会有帮助。
或添加 where tableName = 'All'
以仅获得数据库级别的授权。
我正在尝试将 XMLAGG 实施到我用来在 Teradata 中查找用户访问权限的查询中。这是查询:
SELECT
A.RoleName
, B.DatabaseName
--, B.AccessRight
, Trim(Trailing ',' FROM (XmlAgg(Trim(B.AccessRight) || ',' ORDER BY B.AccessRight) (VARCHAR(10000)))) AS AccessRight
FROM DBC.RoleMembers A JOIN DBC.AllRoleRights B
ON A.RoleName = B.RoleName
WHERE Grantee='?your_id'
GROUP BY 1,2
ORDER BY 2,1,3
;
以前我只是 select 注释行 B.AccessRight
并梳理结果,但我想将每个角色的访问权限合并到一行中。
上面的查询确实有效,但偶尔会有重复的行。这是输出的一个简单示例:
+----------+--------------+-------------+
| RoleName | DatabaseName | AccessRight |
+----------+--------------+-------------+
| Role1 | dbA | CM, CT, CV |
+----------+--------------+-------------+
| Role2 | dbB | R, R, R, R | <-- Problematic column
+----------+--------------+-------------+
| Role3 | dbC | E, R |
+----------+--------------+-------------+
我已尝试通过在我的 XMLAGG 查询中添加 DISTINCT 来解决此问题,正如我在 several other solutions 此处看到的那样,但我似乎无法自行解决。
DBC.AllRoleRightsV 包括数据库、table 或列级别的权限。因此,您可能会在数据库级别获得重复项。
join ( select distinct databasename, accessright from DBC.AllRoleRightsV ) as B
可能会有帮助。
或添加 where tableName = 'All'
以仅获得数据库级别的授权。