3

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

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

如果我有一个我想找到的记录,这很好,但我现在坚持他如何为多条记录执行此操作。

我想知道我是否可以以某种方式将其用作主查询的子查询,但我似乎找不到让它工作的方法。

我想要的是替换pkSDSID上面第一个 where 子句中的硬编码,即 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 并不是那么好,我只是不知道从哪里开始。

这真的可能吗?

谢谢丹

4

1 回答 1

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
于 2013-05-13T13:31:36.827 回答