如何解决使用合并插入最新记录
我需要合并两个表,如果原始表(即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 我建议以下内容: 换句话说:让我获得MT中DATE大于或等于OT 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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。