【发布时间】:2023-03-05 14:34: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 [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 AND Value = 400,并将更新所有剩余数据的日期。
但是,我想为所有未匹配的ID字段值制作INSERT,在这个例子中,我想得到这样的结果:
+----+------------------+
| 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 语句是否可以实现?
【问题讨论】:
-
你的最终输出逻辑不清楚
-
但是,我想对所有未匹配的 ID 字段值进行 INSERT ...但记录
(1,100), (1,200)do来一场比赛。 -
如果发生
NOT MATCH,我想插入来自[NewTable]的所有不匹配[ID]值的数据,希望它有意义.. -
但是,来自
[NewTable]的记录(1,100), (1,200)确实 匹配。为什么要插入它们? -
我同意逻辑没有意义......也许如果您解释了您要解决的问题,我们可以提供帮助。
标签: sql sql-server sql-server-2012