sql-server - 加盟条件不合格
问题描述
我有 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
有什么帮助吗?!
解决方案
您可以使用递归 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
推荐阅读
- sql - 查询后使用 SQL 数据集 (System.Data.InternalDataCollectionBase)
- javascript - 在 Adobe Acrobat Pro DC 中创建自定义击键脚本时,初始化变量“AF”会删除整个脚本
- javascript - 如何更改输入容器的样式
- node.js - react-native 项目创建给出 node-pre-gyp Hit error socket hang up error
- php - PHP使用数组值匹配另一个数组的键,然后将值提取到新数组中
- mips - MARS 中的 MIPS 程序参数
- visual-c++ - 无法从函数内的数组中提取信息以打印直方图(C++)
- javascript - 比较两个对象以创建一个新对象
- r - 使用正则表达式在R中提取括号中的数字
- python - 无法对 deepLabv3+ 推理进行 MeanIOU 或混淆矩阵