我在previous post中问了同样的问题,但无法正确解释我的要求,因此没有得到理想的结果。我想做这样的事情:
总共有14个级别。每个级别可以有任意数量的用户。谢谢你在上一篇文章中提供的答案,我试过但没有人给我想要的结果。请让我知道如何从这开始。 截至目前,我的存储过程如下所示:
ALTER PROCEDURE [dbo].[UserTransac]
@SponsorId varchar(20),
@UserId varchar(20),
@SponsorName varchar(50),
@Level int=1
AS
BEGIN
if not exists(select User_Id from UserTransaction)
insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level,@SponsorName)
else
insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level,@SponsorName)
insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level+1,@SponsorName)
END
插入声明一直持续到第14级 执行存储过程后,我的表看起来像这样:
任何有用的链接或答案,我可以知道如何处理这将有所帮助。谢谢。
UPDATE:
考虑最后两个记录11和12.对于两个记录,赞助商Id将以RL9115的形式出现。我想要显示所有级别 - 就像这样:
Hope this is somewhat clear to understand what I want to do
答案 0 :(得分:1)
下面的查询应该处理使用CTE获取所需的输出:
DECLARE @TransactionId INT = 11;
WITH levels AS (
SELECT
root.Sponsor_Id,
root.Sponsor_Name,
root.User_Id,
root.Level_No
FROM UserTransaction root
WHERE root.Transaction_Id = @TransactionId
UNION ALL
SELECT
s.Sponsor_Id,
s.Sponsor_Name,
l.User_Id,
Level_No = l.Level_No + 1
FROM UserTransaction s
INNER JOIN levels l ON l.Sponsor_Id = s.User_Id
)
SELECT DISTINCT *
FROM levels
ORDER BY Level_No;
验证答案
更新:将Sponsor_Name添加到结果集。