【问题标题】:MERGE statement issueMERGE 语句问题
【发布时间】:2023-03-05 14:34:01
【问题描述】:

我有一个表 [ExistingTable] 包含三列:IDValueDate

+----+------------------+
| 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


【解决方案1】:

我认为这可以通过 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

如果您随后从ExistingTable 中选择,您将获得:

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

【讨论】:

  • 感谢@gofr1,但我肯定需要MERGE。我已经有了带有临时表和手动插入/更新语句的代码,我只是想要它与合并
  • 为什么要合并?根据需要插入数据不是 MERGE 的工作,而是 INSERT 的工作。
猜你喜欢
  • 2010-11-28
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多