我试图将我的查询合并到一个联接中以带回一些记录。

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

10-07 14:00
查看更多