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结合起来?按照您的要求插入数据不是一个合并作业,而是一个插入作业。