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

検索したいレコードが 1 つある場合はこれで問題ありませんが、複数のレコードに対してこれを行う方法については、彼に固執しています。

メインクエリのサブクエリとしてこれを何らかの方法で内部結合できるかどうか疑問に思っていましたが、それを機能させる方法が見つからないようです。

私が望むのは、pkSDSID上記のような最初の where 句でハードコードされた 50605 を置き換え、代わりに列または多数のレコードを使用してLastestSDS、各レコードを取得することです。

例はこれです

50605 と 45670 という 2 つのレコードがあります。

どちらもテーブルにそのような新しいレコードがあります

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 に答える