XMLAGG дублирует в результатах - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь внедрить XMLAGG в запрос, который я использую для поиска пользовательских AccessRights в 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
;

Ранее я просто выбирал закомментированную строку 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, как я видел в нескольких других решениях , но, похоже, сам не могу понять, что это правильно.

1 Ответ

0 голосов
/ 20 мая 2018

DBC.AllRoleRightsV включает права на уровне базы данных, таблицы или столбца.Таким образом, вы можете получить дубликаты на уровне базы данных.

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

может помочь.

Или добавить where tableName = 'All', чтобы получить только гранты уровня базы данных.

...