我正在尝试将我的查询合并到一个联接中以带回一些记录。
这是我的查询的第一部分,这正是我想要的,并返回此结果集中的最新记录,因为每个记录通过fkSDSID链接到另一个,如下所示,第一个没有id作为第一个,没有以前的记录。
pkSDSID fkSDSID
50605 NULL
88377 50605
90602 88377
90616 90602
此查询从结果返回90616。
DECLARE @LatestSDS INT
with tree as (
SELECT pkSDSID, fkSDSID
FROM tblSDS
WHERE pkSDSID = 50605
UNION ALL
SELECT t1.pkSDSID, t1.fkSDSID
FROM tblSDS t1
JOIN tree p ON p.pkSDSID = t1.fkSDSID
)
SELECT TOP 1 @LatestSDS = pkSDSID FROM tree ORDER BY pkSDSID DESC
SELECT @LatestSDS
如果我想要找到一条记录,但我现在仍然坚持如何为多条记录执行此操作,这很好。
我想知道我是否可以以某种方式将其作为我的主要查询的子查询以内部加入,但我似乎无法找到一种方法来使其工作。
我想要的是替换第一个where子句中的硬编码pkSDSID
,如上面的50605,而是使用一列或多个记录,并为每条记录获取LastestSDS
。
这是
的一个例子我有两条记录,分别为50605和45670。
他们都有更新的记录,如表
pkSDSID fkSDSID
50605 NULL
88377 50605
90602 88377
90616 90602
pkSDSID fkSDSID
45670 NULL
50123 45670
51234 50123
60125 51234
因此,对于每个记录,我需要使用上面的代码来获取最新记录,分别为90616和60125。
然后在列表中显示这些新记录。
我希望这是有道理的,我对SQL不是那么好,我只是不知道从哪里开始。
这实际上可行吗?
谢谢Dan
答案 0 :(得分:2)
在Q更新后编辑
DECLARE @t TABLE (pkSDSID int NOT NULL, fkSDSID int NULL);
INSERT @t VALUES
(50605, NULL),
(88377, 50605),
(90602, 88377),
(90616, 90602),
(45670, NULL),
(50123, 45670),
(51234, 50123),
(60125, 51234);
with tree as (
SELECT S.pkSDSID, S.fkSDSID, 0 AS TreeLevel, S.pkSDSID AS TreeTop
FROM @t S
WHERE S.pkSDSID IN (50605, 45670)
UNION ALL
SELECT t1.pkSDSID, t1.fkSDSID, TreeLevel +1, p.TreeTop
FROM @t t1
JOIN tree p ON p.pkSDSID = t1.fkSDSID
)
, Filter AS
(
SELECT
pkSDSID,
ROW_NUMBER() OVER (PARTITION BY TreeTop ORDER BY TreeLevel DESC) AS rn
FROM tree
)
SELECT pkSDSID FROM Filter WHERE rn = 1