Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用“合并”插入最新记录_Sql Server_Merge_Sql Server 2017 - Fatal编程技术网

Sql server 使用“合并”插入最新记录

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,则将该记录插入另一个表,即MergedTable。 如果该记录不在合并表中,它将按预期工作,但如果有任何日期较旧的记录,我将收到消息:0行受影响

我做错了什么? 谢谢

这是原来的桌子

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.DATEOT.DATE,并可能按目标添加

以下是您可以在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 |
+--------------+------------+-------------------------+

我相信您所需要做的就是将日期比较从和MT.DATEOT.DATE,并可能按目标添加

以下是您可以在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子句,所以需要调整逻辑。 您的查询查找合并表中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按目标”表暗示为“不匹配”。你不需要添加它,但我总是喜欢明确地告诉你发生了什么。