0

次のデータベース設計があります。

Table Content
ID     Status     ReplacedId

1   C       NULL
2   C       1
3   C       2
4   A       3
5   A       NULL
6   A       NULL
7   A       NULL

ここでのロジックは次のとおりです

ID "1" はキャンセルされ、代わりに ID "2" が作成されるため、Record 2 は ReplacedId 列で ID "1" への参照を持ちます。iD 2 をキャンセルして ID「3」を作成し、「3」をキャンセルして「4」を作成します。キャンセルされたレコードのステータスは「C」で、アクティブなレコードのステータスは「A」です。

私の要件:

Id (1) を渡して Id の Active レコードを表示する必要があります。それがキャンセルされたレコードである場合、それ以外の場合は同じレコードがアクティブなレコードである場合です。

4

1 に答える 1

0
DECLARE @Table TABLE(
        RecordID INT,
        Status VARCHAR(20),
        ParentID INT
)

INSERT INTO @Table SELECT     1,'C',NULL
INSERT INTO @Table SELECT     2,'C',1
INSERT INTO @Table SELECT     3,'C',2
INSERT INTO @Table SELECT     4,'A',3
INSERT INTO @Table SELECT     5,'A',NULL
INSERT INTO @Table SELECT     6,'A',NULL

DECLARE @RecordID INT

SELECT @RecordID = 1

;WITH Selects AS (
        SELECT *
        FROM    @Table
        WHERE   RecordID = @RecordID
        UNION ALL
        SELECT  t.*
        FROM    @Table t INNER JOIN
                Selects s ON t.ParentID = s.RecordID
)
SELECT  *
FROm    Selects where Status = 'A'
于 2013-08-26T07:28:26.543 に答える