SQL Server连接复杂子查询



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

这是我的查询的第一部分,这正是我想要的,并返回这个结果集中的最新记录,因为每个记录都由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

最新更新