微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用合并插入最新记录

如何解决使用合并插入最新记录

我需要合并两个表,如果原始表(即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.DATE更改为AND 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),[DATE] datetime
);

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

INSERT INTO @MergedTable VALUES
    ( 'ExampleTable','2020-10-08 03:10:26.013' ),( 'ExampleTable','2020-10-07 03:10:26.013' ),'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

我建议以下内容:

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的任何行。如果没有这样的行,请将其插入表中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。