【问题标题】:How can I use STUFF in a JOIN to append data to a column, grab DISTINCT values and order by DESC?如何在 JOIN 中使用 STUFF 将数据附加到列,获取 DISTINCT 值并按 DESC 排序?
【发布时间】:2018-10-03 15:35:38
【问题描述】:

我要做的是找到所有相关记录。问题是,似乎我只能获得第三条相关记录,而且什么也没有。我们的记录可以有 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 - 第 2 行 field2 中的 04460576 连接到第 3 行 field1 中的 04460576,04776412 第 3 行 field2 连接到第 6 行中的 04776412 field1

4、9 - 第 4 行字段 2 中的 04983582 连接到 04983582 第 9 行字段 1

5、7 -- 第 5 行 field2 中的 04801903 连接到第 7 行 field1 中的 04801903

我需要的是连接那些仍然相关的记录如果它们在 field2 列中连接,则将它们从列表中删除。

这就是我要找的。我希望让它们按所示排序:

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

我怎样才能做到这一点?

【问题讨论】:

  • 使用递归 cte?

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

您可以尝试如下递归 CTE 方法 See demo here

; 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

【讨论】:

  • 谢谢!效果很好。我用其中的其他数据对其进行了测试,不幸的是它不适用于我输入的数据。请参阅此处的示例:rextester.com/edit/BSAWHX55201。知道如何解决吗?
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多