更新并在单个查询中选择(续)

时间:2014-09-07 16:24:18

标签: sql sql-server tsql stored-procedures

我在previous post中问了同样的问题,但无法正确解释我的要求,因此没有得到理想的结果。我想做这样的事情:

enter image description here

总共有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级 执行存储过程后,我的表看起来像这样: enter image description here

任何有用的链接或答案,我可以知道如何处理这将有所帮助。谢谢。

UPDATE:

enter image description here

考虑最后两个记录11和12.对于两个记录,赞助商Id将以RL9115的形式出现。我想要显示所有级别 - 就像这样:
    enter image description here

Hope this is somewhat clear to understand what I want to do

1 个答案:

答案 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;

使用this SQL Fiddle.

验证答案

更新:将Sponsor_Name添加到结果集。