簡體   English   中英

使用 Merge 插入最新記錄

[英]Insert the newest record using Merge

我需要合並兩個表,如果原始表(即OriginalTable)中的記錄較新,則將此記錄插入另一個表(即MergedTable)。 如果該記錄不在 MergedTable 中,它會按預期工作,但如果有任何日期較舊的記錄,我會收到消息:“(0 行受影響)”。

我做錯了什么? 謝謝!!

這是原表

OriginalTable:
TABLE           YEAR_MONTH  DATE
ExampleTable    202009      2020-10-19 17:25:31.337     <-- This records needs to be inserted

這是命運表:

MergedTable:
TABLE           YEAR_MONTH  DATE
ExampleTable    202009      2020-10-08 03:10:26.013
ExampleTable    202009      2020-10-07 03:10:26.013
ExampleTable    202009      2020-10-06 03:10:26.013

這是我正在使用的代碼:

MERGE [dbo].[MergedTable] MT
USING (SELECT TOP 1 YEAR_MONTH,DATE FROM OriginalTable WHERE TABLE='ExampleTable' ORDER BY DATE DESC) OT
    ON MT.YEAR_MONTH = OT.YEAR_MONTH
    AND MT.TABLE='ExampleTable'
    AND MT.DATE<OT.DATE
WHEN NOT MATCHED
    THEN INSERT (TABLE,YEAR_MONTH,DATE)
        VALUES('ExampleTable ', T.YEAR_MONTH,'');

我相信您需要做的就是將您的 DATE 比較從AND MT.DATE < OT.DATEAND MT.DATE > OT.DATE並且可能添加BY TARGET

這是您可以在 SSMS 中運行的測試:

DECLARE @OriginalTable table (
    [TABLE] varchar(50), [YEAR_MONTH] varchar(6), [DATE] datetime
);

DECLARE @MergedTable table (
    [TABLE] varchar(50), [YEAR_MONTH] varchar(6), [DATE] datetime
);

INSERT INTO @OriginalTable VALUES (
    'ExampleTable', '202009', '2020-10-19 17:25:31.337'
);

INSERT INTO @MergedTable VALUES
    ( 'ExampleTable', '202009', '2020-10-08 03:10:26.013' ),
    ( 'ExampleTable', '202009', '2020-10-07 03:10:26.013' ),
    ( 'ExampleTable', '202009', '2020-10-06 03:10:26.013' );

/* Add the record from @OriginalTable if it is newer */
MERGE @MergedTable MT
USING (
    SELECT TOP 1 [YEAR_MONTH], [DATE] FROM @OriginalTable WHERE [TABLE] = 'ExampleTable' ORDER BY [DATE] DESC
) OT
    ON MT.[YEAR_MONTH] = OT.[YEAR_MONTH]
    AND MT.[TABLE] = 'ExampleTable'
    AND MT.[DATE] > OT.[DATE]
WHEN NOT MATCHED BY TARGET
    THEN INSERT ( [TABLE], [YEAR_MONTH], [DATE] )
        VALUES( 'ExampleTable', OT.[YEAR_MONTH], OT.[DATE] );

/* Show the updated @MergedTable */
SELECT * FROM @MergedTable ORDER BY [DATE] DESC;

返回:

+--------------+------------+-------------------------+
|    TABLE     | YEAR_MONTH |          DATE           |
+--------------+------------+-------------------------+
| ExampleTable |     202009 | 2020-10-19 17:25:31.337 |
| ExampleTable |     202009 | 2020-10-08 03:10:26.013 |
| ExampleTable |     202009 | 2020-10-07 03:10:26.013 |
| ExampleTable |     202009 | 2020-10-06 03:10:26.013 |
+--------------+------------+-------------------------+

由於您使用的是 WHEN NOT MATCHED 子句,因此您需要調整您的邏輯。 您的查詢在 MergedTable 中查找 MT.Date < OT.Date 中的每一行。 這將匹配樣本中的每一行,因為新行的時間戳較舊。 因此不使用 WHEN NOT MATCHED。

我建議如下:

MERGE [dbo].[MergedTable] MT
USING (SELECT TOP 1 YEAR_MONTH,DATE FROM OriginalTable WHERE TABLE='ExampleTable' ORDER BY DATE DESC) OT
    ON MT.YEAR_MONTH = OT.YEAR_MONTH
    AND MT.TABLE='ExampleTable'
    AND MT.DATE>=OT.DATE  /* <-- switched the comparison */
WHEN NOT MATCHED
    THEN INSERT (TABLE,YEAR_MONTH,DATE)
        VALUES('ExampleTable', OT.YEAR_MONTH,OT.DATE);

用文字說:獲取 MT 中 DATE 大於或等於 OT 的 DATE 的任何行。 如果沒有這樣的行,則將其插入表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM