Функция stuff возвращает двойные записи при использовании с внутренним соединением - PullRequest
1 голос
/ 11 ноября 2019

Здравствуйте! Я хочу получить список обязанностей пользователя из таблицы ответственности с соответствующим идентификатором user_id из таблицы пользователя, но я получаю дубликаты записей, когда я применил внутреннее соединение к этим таблицам.

Таблица пользователей enter image description here

Таблица ответственности

enter image description here

и вот запрос.

SELECT DISTINCT u.[user_id], 
                u.first_name, 
                u.mobile, 
                responsibility = Stuff((SELECT ',' + responsibility_nm 
                                        FROM   dms_responsibility AS dr 
                                        WHERE  responsibility_id = 
                                               dur.responsibility_id 
                                        FOR xml path('')), 1, 1, '') 
FROM   dms_user_responsibilities AS dur 
       INNER JOIN dms_user AS u 
               ON u.[user_id] = dur.[user_id] 
                  AND u.territory_cd = dur.territory_cd 
GROUP  BY u.[user_id], 
          u.first_name, 
          dur.responsibility_id, 
          u.mobile 

enter image description here

Этот запрос возвращает дубликаты. но если я попытаюсь получить ответственность без внутреннего соединения, как это, то я получу правильный результат.

select STUFF((select ',' + responsibility_nm from DMS_Responsibility 
where responsibility_id in (1,2) FOR XML PATH('')), 1, 1, '') as res

enter image description here

Я запутался, как причинапроблема.

1 Ответ

0 голосов
/ 11 ноября 2019

Когда вы сгенерировали для XML, между вашими users и resposibilities нет никакой связи. Попробуйте добавить отношения во время построения XML.

SELECT DISTINCT u.[user_id], 
                u.first_name, 
                u.mobile, 
                responsibility = Stuff ((SELECT ',' + responsibility_nm 
                                         FROM   dms_responsibility AS dr 
                                 INNER JOIN dms_user_responsibilities t1 
                                         ON dr.responsibility_id = 
                                            t1.responsibility_id 
                                 INNER JOIN dms_user t2 
                                         ON t2.[user_id] = t1.[user_id] 
                                            AND t2.territory_cd = 
                                                t1.territory_cd 
                                         WHERE  t1.responsibility_id = 
                                                dur.responsibility_id 
                                         FOR xml path('')), 1, 1, '') 
FROM   dms_user_responsibilities AS dur 
       INNER JOIN dms_user AS u 
               ON u.[user_id] = dur.[user_id] 
                  AND u.territory_cd = dur.territory_cd 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...