Sql 合并语句问题

Sql 合并语句问题,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个表[ExistingTable],有三列:ID、Value和Date +----+------------------+ | ID | Value | Date | +----+------------------+ | 1 | 100 |2016-01-01| | 1 | 200 |2016-01-01| | 1 | 300 |2016-01-01| | 2 | 200 |2016-01-01| | 2 | 300 |2016-01-01| +--

我有一个表
[ExistingTable]
,有三列:
ID
Value
Date

+----+------------------+
| ID | Value | Date     |
+----+------------------+
| 1  | 100   |2016-01-01|
| 1  | 200   |2016-01-01|
| 1  | 300   |2016-01-01|
| 2  | 200   |2016-01-01|
| 2  | 300   |2016-01-01|
+----+------------------+
第二个表,
[NewTable]

+----+------------+
| ID | Value      |
+----+------------+
| 1  | 100        |
| 1  | 200        |
| 1  | 400        |
| 2  | 200        |
| 2  | 300        |
+----+------------+
如果我写一个merge语句,如下所示:

MERGE [ExistingTable] AS T1
USING [NewTable] AS T2 ON (T1.[ID] = T2.[ID] AND T1.[Value] = T2.[Value])

WHEN NOT MATCHED THEN 
    INSERT([ID], [Value], [Date]) 
    VALUES(T2.[ID], T2.[Value], Getdate())

WHEN MATCHED THEN 
    UPDATE SET [Date] = Getdate();
查询将插入ID=1和Value=400,并更新所有剩余数据的日期

但是,我想对所有未匹配的
ID
字段值进行
插入
,在本例中,我想得到这种结果:

+----+------------------+
| ID | Value | Date     |
+----+------------------+
| 1  | 100   |2016-01-01|
| 1  | 200   |2016-01-01|
| 1  | 300   |2016-01-01|
| 2  | 200   |2016-10-15|
| 2  | 300   |2016-10-15|
| 1  | 100   |2016-10-15|
| 1  | 200   |2016-10-15|
| 1  | 400   |2016-10-15|
+----+------------------+

使用MERGE语句可以实现吗?

我认为这可以通过CTE和INSERT实现:

;WITH cte AS ( --here we will store all ID's that have 1 and more not matched Values
SELECT n.ID
FROM [NewTable] n
LEFT JOIN ExistingTable e
    ON n.ID = e.id and n.[Value] = e.[Value]
WHERE e.ID IS NULL
)

INSERT INTO ExistingTable
SELECT  n.ID,
        n.[Value],
        GETDATE()
FROM [NewTable] n
INNER JOIN cte c
    ON c.ID = n.ID
如果然后从现有表中选择,您将得到:

ID  Value   Date
1   100     2016-01-01
1   200     2016-01-01
1   300     2016-01-01
2   200     2016-01-01
2   300     2016-01-01
1   100     2016-10-15
1   200     2016-10-15
1   400     2016-10-15

我认为这可以通过CTE完成,并插入:

;WITH cte AS ( --here we will store all ID's that have 1 and more not matched Values
SELECT n.ID
FROM [NewTable] n
LEFT JOIN ExistingTable e
    ON n.ID = e.id and n.[Value] = e.[Value]
WHERE e.ID IS NULL
)

INSERT INTO ExistingTable
SELECT  n.ID,
        n.[Value],
        GETDATE()
FROM [NewTable] n
INNER JOIN cte c
    ON c.ID = n.ID
如果然后从现有表中选择,您将得到:

ID  Value   Date
1   100     2016-01-01
1   200     2016-01-01
1   300     2016-01-01
2   200     2016-01-01
2   300     2016-01-01
1   100     2016-10-15
1   200     2016-10-15
1   400     2016-10-15

您的最终输出逻辑不清晰,但是,我想对所有未匹配的ID字段值进行插入。。。但是记录
(1100)、(1200)
确实有匹配项。如果发生
不匹配
,我想插入
[NewTable]
中未匹配
[ID]
值的所有数据,希望有意义。但是,
[NewTable]
中的记录
(1100)、(1200)
确实有匹配项。为什么要插入它们?我同意逻辑没有意义。。。如果您解释了您试图解决的问题,我们可能会有所帮助。您的最终输出逻辑不清楚,但是,我想对所有未匹配的ID字段值进行插入。。。但是记录
(1100)、(1200)
确实有匹配项。如果发生
不匹配
,我想插入
[NewTable]
中未匹配
[ID]
值的所有数据,希望有意义。但是,
[NewTable]
中的记录
(1100)、(1200)
确实有匹配项。为什么要插入它们?我同意逻辑没有意义。。。如果您解释了您试图解决的问题,我们可能会有所帮助。谢谢@gofr1,但我肯定需要它与
MERGE
一起使用。我已经有了temp table和手动insert/update语句的代码,我只是想把它和mergeWhy merge结合起来?按照您的要求插入数据不是一项合并工作,而是一项插入工作。谢谢@gofr1,但我确实需要它与
MERGE
一起使用。我已经有了temp table和手动insert/update语句的代码,我只是想把它和mergeWhy merge结合起来?按照您的要求插入数据不是一个合并作业,而是一个插入作业。