-4

助けてください。T-SQL によって履歴データも保存するために、ディメンションに対してインクリメンタル プロセスを実行する必要があります。ステートメントを使用しようとMERGEしていますが、このプロセスはターゲットには存在するがソース テーブルには存在しないデータを削除するため、機能しません。

誰か提案がありますか?

たとえば、私はソーステーブルを持っています: ソーステーブルは私のSTAGEです,
Cod Descript State
AAA Desc1 MI
BBB Desc 2 TX
CCC Desc 3 MA
最初のロードでは、私のディメンションはSTAGEと等しくなります

ただし、たとえばソーステーブルの値を変更できます

AAA CHANGEDESCRIPTION ミ

したがって、次のようにディメンションを更新する必要があります:
Cod Descript State
AAA Desc1 Mi before
AAA CHANGEDESCRIPTION MI actual
BBB Desc 2 TX actual
CCC Desc 3 MA actual
これは私の DW であり、実際の情報とすべての履歴が必要です

4

2 に答える 2

0

DELETE句にコメントしました...どう思いますか教えてください

        MERGE DimTarget AS [Target] --— begin merge statements (merge statements end with a semi-colon)
        USING TableSource AS [Source]
        ON [Target].ID = [Source].ID AND [Target].[IsCurrentRow] = 1
        WHEN MATCHED AND --— record exists but values are different
        (
                [Target].Dscript <> [Source].Descript
            )
        THEN UPDATE SET --— update records (Type 1 means record values are overwritten)
              [Target].[IsCurrentRow] = 0
             -- , [Target].[ValidTo] = GETDATE()
        WHEN NOT MATCHED BY TARGET --— record does not exist
        THEN INSERT --— insert record
        (
            Descritp
        , [IsCurrentRow]
        )
        VALUES
        (
        Descript
        , 1
        )
       --WHEN NOT MATCHED BY SOURCE --— record exists in target but not source
       --THEN DELETE -- delete from target
        OUTPUT $action AS Action, [Source].* --— output results
于 2016-08-03T22:44:51.847 に答える
0

これを試して。現在のレコードの列Agingは常に「0」であり、変更の世代を示します。

SELECT * INTO tbl_Target FROM (VALUES
('AAA','Desc1','MI',0),('BBB','Desc 2','TX',0),('CCC','Desc 3','MA',0)) as X(Cod, Descript, State, Aging);
GO
SELECT * INTO tbl_Staging FROM (VALUES ('AAA','Desc4','MI')) as X(Cod, Descript, State);
GO
UPDATE t SET Aging += 1
FROM tbl_Target as t
INNER JOIN tbl_Staging as s on t.Cod = s.Cod;
GO
INSERT INTO tbl_Target(Cod, Descript, State, Aging)
SELECT Cod, Descript, State, 0
FROM tbl_Staging;
GO
SELECT * FROM tbl_Target;

ステージング テーブルに「変更されていない」レコードがある場合、誤った変更が行われることに注意してください。その場合は、両方のクエリでそれらを除外する必要があります。

于 2016-08-03T17:54:40.663 に答える