迭代查询

彗星 2016-10-09 10:53:51
大咖们,小弟请教下一个sqlserver的查询语句
数据如下:
文件ID 发送人 接收人
1 小明 小李
1 小李 小强
1 小李 小王
1 小强 小二
1 小王 萌萌
查询转发人可以查看其后的文件转发记录,例如查询小李的转发记录:
1 小李 小强
1 小李 小王
1 小强 小二
1 小王 萌萌
怎么用一个sql实现
...全文
110 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2016-10-09
  • 打赏
  • 举报
回复

;with t(文件ID,发送人,接收人) AS
(

   select  1,N'小明',N'小李' union all
   select  1,N'小李',N'小强' union all
   select  1,N'小李',N'小王' union all
   select  1,N'小强',N'小二' union all
   select  1,N'小王',N'萌萌'
),cte AS(
select * from t where t.发送人=N'小李'
union all
select t.* from t inner join cte on t.发送人=cte.接收人 and t.文件ID=cte.文件ID
)
select * from cte
/*
文件ID	发送人	接收人
1	小李	小强
1	小李	小王
1	小王	萌萌
1	小强	小二
*/
中国风 2016-10-09
  • 打赏
  • 举报
回复
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([文件ID] int,[发送人] nvarchar(22),[接收人] nvarchar(22))
Insert #T
select 1,N'小明',N'小李' union all
select 1,N'小李',N'小强' union all
select 1,N'小李',N'小王' union all
select 1,N'小强',N'小二' union all
select 1,N'小王',N'萌萌'
GO
;WITH CTET
AS
(
SELECT b.* FROM #T AS a INNER JOIN #T AS b ON a.文件ID=b.文件ID AND b.发送人 = a.接收人 WHERE a.接收人=N'小李'
UNION ALL
SELECT b.* FROM CTET AS a INNER JOIN #T AS b ON b.文件ID=a.文件ID AND b.发送人 = a.接收人
)
SELECT * FROM CTET
/*
文件ID	发送人	接收人
1	小李	小强
1	小李	小王
1	小王	萌萌
1	小强	小二
*/
xxfvba 2016-10-09
  • 打赏
  • 举报
回复
;with T(id,sender,receiver)as (select 1 ,'小明','小李' union all select 1, '小李' , '小强' union all select 1 , '小李', '小王' union all select 1, '小强' , '小二' union all select 1, '小王', '萌萌'), cte as (select sender,receiver from T where sender='小李' union all select T.sender,t.receiver from T,cte where t.sender=cte.receiver) select * from cte

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧