SQL Server加入复杂子查询

时间:2013-05-13 13:08:04

标签: sql sql-server join

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

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

答案 0 :(得分: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