我试图将我的查询合并到一个联接中以带回一些记录。
这是我查询的第一部分,它完全符合我的要求,并从该结果集中返回最新记录,因为每个记录都通过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