Как получить разделенные запятыми значения в SQL из 2 разных таблиц, используя isnull - PullRequest
0 голосов
/ 02 мая 2018

Привет, у меня есть 2 разные таблицы "Users" и "UsersReportsTo" есть два столбца в качестве внешнего ключа в UsersReportsTo Table column1 = Userid и column2 = ReportsTo, оба содержат идентификаторы пользователя

Результат, который я хочу получить, - это разделенный запятыми идентификатор электронной почты для отчетов

см. Изображение

enter image description here

один пользователь может отчитываться перед несколькими пользователями, например, за одного руководителя группы, за несколько помощников

Я пробовал ниже запрос, но я не получаю правильный результат

select isnull(STUFF((SELECT ',' + Email 
                     from UsersReportsTo urt 
                     Left join Users rpt WITH (NOLOCK) on rpt.UserID=urt.UserID 
                     WHERE active=1  and urt.UserID = 425 FOR XML PATH('')), 1, 1, ''),'') as rept 
from UsersReportsTo

если я хочу, чтобы отчеты для идентификатора пользователя = 3

Ожидаемый результат: -

qrst@g.com,abc@g.com,efg@g.com

Ответы [ 3 ]

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

попробуйте это в окне запроса и запустите

WITH Email as       (
                                SELECT          rpt.Email as emailaddress
                                FROM                Users rpt
                                WHERE           active=1  
                                AND                 urt.UserID = 3
                                UNION ALL 
                                SELECT          rpt2.Email as emailaddress
                                FROM                UsersReportsTo urt --Teams
                                LEFT JOIN       Users rpt WITH (NOLOCK) on urt.UserID = rpt.UserID 
                                LEFT JOIN       Users rpt2 WITH (NOLOCK) on rpt2.UserID=urt.ReportsTo 
                                WHERE           active=1  
                                AND                 urt.UserID = 3
                                )

select isnull(STUFF((SELECT  ',' + emailaddress from Email
                                    FOR XML PATH('')), 1, 1, ''),'') as rept 

Вы выбираете пользователя, а затем объединяете руководителей команд. Из этого списка вы можете разделить список

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

Спасибо за вашу помощь. Я понял, выбор идентификатора электронной почты будет из таблицы пользователей, мой запрос был неправильным, теперь я нашел его, вот что я сделал ниже.

выберите isnull (материал ((выберите ',' + электронная почта от пользователей осталось присоединиться к UsersReportsTo WITH (NOLOCK) по UsersReportsTo.ReportsTo = Users.UserID где Users.active = 1 и UsersReportsTo.userID = 425 для XML-пути ('')), 1, 1, ''), '') как reptoemail

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

Вам просто нужно исправить выражение where внутри stuff() функции:

select isnull(stuff((select',' + Email 
                     from UsersReportsTo urt 
                     left join Users rpt WITH (NOLOCK) on rpt.UserID = urt.ReportsTo
                     where u.userid = rpt.UserID and active = 1
                     for xml path('')), 1, 1, ''),'') as rept 
from UsersReportsTo u
where UserId = 3
group by u.UserId;

Также читайте Вредные привычки: везде положить NOLOCK

Если у вас установлена ​​последняя версия SQL Server (2017), вы можете использовать STRING_AGG function

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...