Функция Stuff для нескольких столбцов в SQL Server - PullRequest
0 голосов
/ 31 октября 2019

У меня есть несколько запросов для заполнения определенного столбца.

Запрос 1:

with cte as 
(
    select distinct
        w.Work_WorkID, k.Name as "Secretariat_Attendees"  
    from 
         d,  m,  s,  w,  a,  k
    where  
        d.DataID = m.Map_MapObjID 
        and m.Map_MapID = s.SubWork_MapID 
        and s.SubWork_WorkID = w.Work_WorkID
        and w.Work_WorkID = a.WF_ID 
        and d.DataID = 35269818 
        and a.WF_AttrID = 17 
        and k.ID = a.WF_ValInt
)
select distinct 
    t2.Work_WorkID,
    stuff((select N' ; ' + Secretariat_Attendees
           from (select Work_WorkID, Secretariat_Attendees
                 from cte t1 
                 where t1.Work_WorkID = t2.Work_WorkID) AS t  
           for xml path('')), 1, 2, '') + N'' Secretariat_Attendees 
from cte t2;

Выход запроса 1:

Work_WorkID  Secretariat_Attendees
----------------------------------------------------
35273587     Admin CEO Office ; BD_TestUser ; Diana
35277687     10023165 ; 10036755 ; 10075193

Запрос 2:

    with cte as (
select  Distinct w.Work_WorkID,k.Name as  "Committee_Attendees"  from  d, m, s, w, a, k
    where d.DataID=m.Map_MapObjID and m.Map_MapID=s.SubWork_MapID and s.SubWork_WorkID=w.Work_WorkID
    and w.Work_WorkID=a.WF_ID and d.DataID=35269818 and a.WF_AttrID=5 and k.ID=a.WF_ValInt
)
select distinct t2.Work_WorkID,
    stuff((select N' ; ' + Committee_Attendees
       from (select Work_WorkID, Committee_Attendees
          from cte t1 where t1.Work_WorkID = t2.Work_WorkID) AS t  
       for xml path('')
    ), 1, 2, '') + N'' Committee_Attendees from cte t2;

Вывод запроса 2:

Work_WorkID Committee_Attendees
35273587     Deva ; User 1 
35277687     User3 ; User 4

Как объединить оба этих запроса в один, чтобы получить желаемый вывод ниже на основе Work_WorkID?

Work_WorkID  Secretariat_Attendees                          Committee_Attendees
35273587     Admin CEO Office ; BD_TestUser ; Diana         Deva ; User 1 
35277687     10023165 ; 10036755 ; 10075193                 User3 ; User 4

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Единственная разница между двумя запросами выглядит как столбец WF_AttrID. Я переместил этот предикат в подзапросы. Вы можете попробовать это. И я также изменил синтаксис соединений вашей таблицы на JOIN

with cte as 
(
    select distinct
        w.Work_WorkID, k.Name as "Attendees", a.WF_AttrID  
    from 
        DTree d
        INNER JOIN WMap m ON d.DataID = m.Map_MapObjID
        INNER JOIN WSubWork s ON m.Map_MapID = s.SubWork_MapID 
        INNER JOIN WWork w ON s.SubWork_WorkID = w.Work_WorkID
        INNER JOIN WFAttrData a ON w.Work_WorkID = a.WF_ID 
        INNER JOIN KUAF k ON  k.ID = a.WF_ValInt
    where  
        d.DataID = 35269818 
        and a.WF_AttrID IN( 5 ,17 )
)
select distinct 
    t2.Work_WorkID,
    stuff((select N' ; ' + Secretariat_Attendees
           from (select Work_WorkID, t1.Attendees AS Secretariat_Attendees
                 from cte t1 
                 where t1.Work_WorkID = t2.Work_WorkID AND t1.WF_AttrID = 17) AS t  
           for xml path('')), 1, 2, '') + N'' Secretariat_Attendees,
    stuff((select N' ; ' + Committee_Attendees
       from (select Work_WorkID, t1.Attendees AS Committee_Attendees
          from cte t1 where t1.Work_WorkID = t2.Work_WorkID AND t1.WF_AttrID = 5) AS t  
       for xml path('')
    ), 1, 2, '') + N'' Committee_Attendees 
from cte t2;
1 голос
/ 31 октября 2019

Кажется, это простое соединение. Если ваша трудность связана с объединением их в один запрос, все, что вам нужно сделать, это заменить имя cte второго запроса на cte2, собрать ctes вместе в начале и использовать оба запроса в качестве производных таблиц:

with cte as(
....first query cte....
)
,cte2 as(
....second query cte
)
select *
from
(
    ....query 1.....
)t1
inner join
(
    ......query 2 but "cte2" instead of "cte"....
)t2 on t1.Work_WorkID=t2.Work_WorkID

Это быстрый, неоптимизированный ответ. У меня такое ощущение, что у ctes и запросов есть общие, оптимизируемые части. Также, пожалуйста, прекратите использовать нотацию onld join (from table1,table2,table3.....) и начните использовать join, вы можете найти причины по всему Интернету.

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