SQL Server连接复杂子查询

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

这对于我想要查找一个记录的情况很好,但现在我遇到的问题是如何对多个记录执行此操作。
我想知道是否可以使用内部连接将其作为主查询的子查询,但我似乎找不到使其正常工作的方法。
我想要的是用第一个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,也不知道接下来该怎么做。

这样做真的可行吗?

谢谢 Dan

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

谢谢你的快速回复。我刚刚测试了你的代码,它可以工作,但是它并不符合我的需求,对此我感到很抱歉。可能是因为我在发布帖子时没有表述清楚。 我会尽力解释得更清楚些。 - Dan Ralphs
我刚刚更新了我的帖子,希望现在更加清晰易懂。再次感谢。 - Dan Ralphs
带有where子句s.pkSDSID = 50605的语句返回了4行,如下所示:pkSDSID 50605 88377 90602 90616我只需要最后一行记录,但是我可以从我的代码中获得它,我想知道的是如何获取多个pkSDSID的最新记录,而不仅仅是50605。每个记录由fkSDSID链接在一起,所以它类似于一个锯齿形树结构。我尝试删除类似s.pkSDSID = 50605的where子句,但现在它会将表中的所有内容都返回,我无法确定这是否是最新的。 - Dan Ralphs
太棒了,非常感谢!我自己进行了一些测试,它运行得非常顺畅。再次感谢您的所有帮助。 - Dan Ralphs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接