22,209
社区成员
发帖
与我相关
我的任务
分享
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
姓名 推荐路径
张三 王五
明明 张三->王五
李思 王五
陈建 明明->张三->王五
默默 李思->王五
*/
--测试数据
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