首页 > 解决方案 > 加盟条件不合格

问题描述

我有 2 张桌子。一个是存储 CID 列表的 #crecs 和存储克隆 CVID 的 #temp1。对于 Crecs 表中的 ID,我想遍历 #temp1 表以查找 max(CVID) 并根据条件提取该 CID 的克隆 CVID 的日期。

我已将要求归结为下表:

    create table #temp1(cid int,cvid int,flag varchar(5), date1 date, clone int)
insert into #temp1
values ('43','1001','A','1/1/2015',null),
        ('43','1002','R','2/1/2015',1001),
        ('43','1003','R','3/1/2015',1002),
        ('43','1004','R','4/1/2015',1003)

create table #crecs(cid int)
insert into #crecs values(43),(44),(45)

select * from #crecs
select * from #temp1

我的查询:

select t2.cid,max(t2.cvid),t2.clone,t1.cvid,t1.date1
from #temp1 t2 , #temp1 t1
join #crecs c on c.cid = t1.cid
where t2.clone = t1.cvid
and t1.clone is null and t1.flag = 'A'
group by t2.cid,t2.cvid,t2.clone,t1.cvid,t1.date1

drop table #temp1,#crecs

期望的输出: 在此处输入图像描述

以下是我的 reextester 链接:

http://rextester.com/GSIG28211

有什么帮助吗?!

标签: sql-serverjoin

解决方案


您可以使用递归 CTE 遍历每个克隆,然后使用 MAX() 检索最后一个级别并显示它的记录。

;WITH RecursiveClones AS
(
    SELECT
        CID = C.cid,
        OriginalCVID = T.cvid,
        ClonedCVID = T.cvid,
        Level = 0
    FROM
        #crecs AS C
        LEFT JOIN #temp1 AS T ON C.cid = T.cid
    WHERE
        NOT EXISTS (SELECT 'does not have a clone' FROM #temp1 AS X WHERE X.cvid = T.clone)

    UNION ALL

    SELECT
        CID = R.cid,
        OriginalCVID = R.OriginalCVID,
        ClonedCVID = T.cvid,
        Level = R.Level + 1
    FROM
        RecursiveClones AS R
        INNER JOIN #temp1 AS T ON R.ClonedCVID = T.clone
),
LastCloneByCID AS
(
    SELECT
        R.CID,
        MaxLevel = MAX(R.Level)
    FROM
        RecursiveClones AS R
    GROUP BY
        R.CID
)
SELECT
    L.CID,
    R.ClonedCVID,
    R.OriginalCVID,
    T.date1
FROM
    LastCloneByCID AS L
    LEFT JOIN RecursiveClones AS R ON
        L.CID = R.CID AND
        L.MaxLevel = R.Level
    LEFT JOIN #temp1 AS T ON 
        T.cid = L.CID AND
        T.CVID = R.OriginalCVID

推荐阅读