大神好,看下这个sql怎么写

YueLingYueLiang 2017-05-19 03:42:13


像图片这样的数据,如果想把某个人前面的所有推荐人查出来,这个语句要怎么写
...全文
267 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
十林 2017-05-22
  • 打赏
  • 举报
回复

DROP Table referrers;
CREATE Table referrers(
"姓名" NVARCHAR(200) NULL,
"推荐人" NVARCHAR(200) NULL,
"推荐人手机" NVARCHAR(200) NULL,
)
INSERT INTO referrers
SELECT N'张三',N'王五','138*******'
UNION ALL SELECT N'李思',N'王五','138*******'
UNION ALL SELECT N'明明',N'张三','139*******'
UNION ALL SELECT N'默默',N'李思','136*******'
UNION ALL SELECT N'陈建',N'明明','137*******'



SELECT 姓名,CAST(推荐人 AS NVARCHAR(200))  AS 推荐人 FROM referrers 

;WITH CTE(level,姓名,推荐人,推荐路径) AS(
SELECT 1 as level, 姓名,CAST(推荐人 AS NVARCHAR(200))  AS 推荐人,CAST(推荐人 AS NVARCHAR(200)) as 推荐路径 FROM referrers 
UNION ALL 

SELECT c.level +1 as level,C.姓名, CAST(R.推荐人 AS NVARCHAR(200))  AS 推荐人,CAST(C.推荐路径+N'->'+R.推荐人 AS NVARCHAR(200))  AS 推荐路径 
FROM CTE C,referrers R 
WHERE C.推荐人=R.姓名
)
SELECT 姓名,推荐路径 FROM(
SELECT ROW_NUMBER() over(partition by 姓名 ORDER BY level desc) as RN,姓名,推荐路径 FROM CTE 
)M
WHERE M.RN=1
/* result
姓名	推荐路径
张三	王五
明明	张三->王五
李思	王五
陈建	明明->张三->王五
默默	李思->王五
*/
二月十六 2017-05-19
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([姓名] nvarchar(22),[推荐人] nvarchar(22),[推荐人手机] nvarchar(31))
Insert #T
select N'张三',N'王五',N'138********' union all
select N'李思',N'王五',N'138********' union all
select N'明明',N'张三',N'139********' union all
select N'默默',N'李思',N'136********' union all
select N'陈建',N'明明',N'137********'
Go
--测试数据结束
;WITH cte AS(
Select * from #T WHERE 姓名='陈建' --例如查询陈建前边所有推荐人
UNION ALL
SELECT #T.* FROM #T JOIN cte ON cte.推荐人 = #T.姓名
)
SELECT 推荐人 FROM cte


ZXYperseverance 2017-05-19
  • 打赏
  • 举报
回复
你能把表结构贴出来吗?

22,209

社区成员

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

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