XMLAGG在结果中重复

时间:2018-05-17 13:19:35

标签: sql teradata

我尝试将XMLAGG实现为一个查询,用于在Teradata中查找用户AccessRights。这是查询:

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
;

以前我只会选择注释行B.AccessRight并梳理结果,但我想将每个角色的AccessRights合并为一行。

上面的查询确实有效,但偶尔会有行重复。这是输出的快速示例:

+----------+--------------+-------------+
| RoleName | DatabaseName | AccessRight |
+----------+--------------+-------------+
| Role1    | dbA          | CM, CT, CV  |
+----------+--------------+-------------+
| Role2    | dbB          | R, R, R, R  |  <-- Problematic column
+----------+--------------+-------------+
| Role3    | dbC          | E, R        |
+----------+--------------+-------------+

我已尝试通过将DISTINCT添加到我的XMLAGG查询来解决此问题,就像我在several其他solutions中看到的那样,但我似乎无法自己解决这个问题。

1 个答案:

答案 0 :(得分:1)

DBC.AllRoleRightsV包括数据库,表或列级别的权限。因此,您可能会在数据库级别上获得重复项。

join ( select distinct databasename, accessright from DBC.AllRoleRightsV ) as B

可能会有所帮助。

或添加where tableName = 'All'以仅获取数据库级授权。