我正试图将我的查询合并到一个连接中以带回一些记录。
这是我的查询的第一部分,这正是我想要的,并返回这个结果集中的最新记录,因为每个记录都由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,我只是不知道从这里去哪里。
这真的可能吗?
谢谢丹
编辑,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