Как я могу использовать STUFF в JOIN для добавления данных в столбец, получения значений DISTINCT и их порядка по DESC? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь найти все связанные записи.Проблема в том, что, кажется, я могу получить только третью связанную запись и ничего после нее.У нас есть записи, которые могут иметь 5+ иждивенцев.

Вот мой первоначальный запрос

CREATE TABLE #Data (
field1 varchar(25),
field2 varchar(50))

insert into #Data (field1, field2)
VALUES ('02968365','05431590'),
('02968365','05431590'),
('04355059','04460576'),
('04355059','05339398'),
('04460576','04776412'),
('04512483','04983582'),
('04512483','05434032'),
('04561297','05482964'),
('04561297','04801903'),
('04776412','05339398'),
('04801903','05482964'),
('04844609','05431253'),
('04844609','05431253'),
('04983582','05434032')


select distinct 
       rtrim(d1.field1) field1,
  STUFF((SELECT DISTINCT '/' + rtrim(d2.field2)
         from #Data d2
         where d1.field1 = d2.field1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,0,'') field2
FROM #Data d1

И вот что производит запрос:

        field1       field2               
______________________________
   1  | 02968365  |  /05431590
   2  | 04355059  |  /04460576/05339398
   3  | 04460576  |  /04776412
   4  | 04512483  |  /04983582/05434032
   5  | 04561297  |  /04801903/05482964
   6  | 04776412  |  /05339398
   7  | 04801903  |  /05482964
   8  | 04844609  |  /05431253
   9  | 04983582  |  /05434032

Этосвязанные строки

2, 3, 6 - 04460576 в строке 2 field2 подключается к 04460576 в строке 3 field1, 04776412 строка 3 field2 подключается к 04776412 field1 в строке 6

4, 9 - 04983582 в строке 4 поле 2 соединяется с 04983582 в строке 9 поля 1

5, 7 - 04801903 в строке 5 поле 2 соединяется с 04801903 встрока 7 field1

Для этого мне нужно подключить те записи, которые все еще связаны или , удалить их из списка, если они связаны в столбце field2.

Это то, что я ищу.Я надеюсь отсортировать их, как показано:

        field1       field2               
______________________________
   1  | 02968365  |  /05431590
   2  | 04355059  |  /04460576/04776412/05339398
   3  | 04512483  |  /04983582/05434032
   4  | 04561297  |  /04801903/05482964
   5  | 04844609  |  /05431253

Как мне это сделать?

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете попробовать рекурсивный подход CTE, как показано ниже См. Демонстрацию здесь

; with selfJoined as 
(
select 
    field1=rtrim(d1.field1) ,
    field2=rtrim(d1.field2)
from #data d1 left join #data d2 
    on d1.field1=d2.field2
where d2.field1 is null
   union all
select 
    field1=c.field1,
    field2=rtrim(d2.field2)
from selfJoined c join #data d2 on rtrim(d2.field1)=c.field2
 )

, output as 
(
    select 
    distinct 
       field1,
  STUFF((SELECT DISTINCT '/' + field2
         from selfJoined s2
         where s.field1 = s2.field1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,0,'') field2
FROM selfJoined s
  )
select * from output
...