Sql server 使用“合并”插入最新记录
我需要合并两个表,如果一条记录在原始表中较新,即OriginalTable,则将该记录插入另一个表,即MergedTable。 如果该记录不在合并表中,它将按预期工作,但如果有任何日期较旧的记录,我将收到消息:0行受影响 我做错了什么? 谢谢 这是原来的桌子Sql server 使用“合并”插入最新记录,sql-server,merge,sql-server-2017,Sql Server,Merge,Sql Server 2017,我需要合并两个表,如果一条记录在原始表中较新,即OriginalTable,则将该记录插入另一个表,即MergedTable。 如果该记录不在合并表中,它将按预期工作,但如果有任何日期较旧的记录,我将收到消息:0行受影响 我做错了什么? 谢谢 这是原来的桌子 OriginalTable: TABLE YEAR_MONTH DATE ExampleTable 202009 2020-10-19 17:25:31.337 <-- This reco
OriginalTable:
TABLE YEAR_MONTH DATE
ExampleTable 202009 2020-10-19 17:25:31.337 <-- This records needs to be inserted
这是我正在使用的代码:
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,'');
我相信您所需要做的就是将日期比较从和MT.DATE
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 |
+--------------+------------+-------------------------+
我相信您所需要做的就是将日期比较从和MT.DATE
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子句,所以需要调整逻辑。 您的查询查找合并表中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中日期大于或等于OT日期的任何行。如果没有这样的行,请将其插入表中。因为您使用的是WHEN NOT MATCHED子句,所以需要调整逻辑。 您的查询查找合并表中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中日期大于或等于OT日期的任何行。如果没有这样的行,请将其插入表中。谢谢。成功了。“按目标”的功能是什么?@CristianAvendaño按目标”表暗示为“不匹配”。你不需要添加它,但我总是喜欢明确地告诉你发生了什么。谢谢。成功了。“按目标”的功能是什么?@CristianAvendaño按目标”表暗示为“不匹配”。你不需要添加它,但我总是喜欢明确地告诉你发生了什么。