3

我试图让我的头脑了解MERGEsql 语句。我想要实现的是:

将新值插入表中,但如果记录已经存在,则CSScolorOrders更新corQuantitycolIDordID

这就是我最终的结果:

MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
ON (SOURCE.colID = 1) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);

不幸的是,它没有引发任何异常,所以我不知道为什么它不起作用。

4

4 回答 4

6

正如这里所讨论的,您将看到合并与听起来完全一样。取两个表并搜索您加入它们的值,我们称之为“X”。如果 X 是匹配项,则您对该记录执行更新。如果它不存在,那么您将使用选定的值对目标表执行插入。

在你的情况下,我不完全确定你是否加入

  (  ON (SOURCE.colID = 1)   )

是正确的。我很确定这需要

on(Source.colID = Target.colID)

所以完整的声明应该是这样的:

MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
on(Source.colID = Target.colID)
WHEN MATCHED THEN 
  UPDATE SET corQuantity = 1 
WHEN NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);

但我没有对此进行测试,也不是 100% 确定您的表列是什么以及您尝试加入的具体内容。但是我提供的链接应该为您指明正确的方向。

希望这可以帮助!

于 2012-05-24T16:46:24.670 回答
4
MERGE INTO accounting_values AS Target
USING (select @entity_id as entity_id, @fiscal_year as fiscal_year, @fiscal_period as       fiscal_period) AS source
ON (target.entity_id = source.entity_id  AND target.fiscal_year = source.fiscal_year AND target.fiscal_period = source.fiscal_period)
WHEN MATCHED THEN
    UPDATE SET value = @value
WHEN NOT MATCHED BY Target THEN
    INSERT 
(entity_id, fiscal_year, fiscal_period, value) 
    VALUES (@entity_ID, @fiscal_year, @fiscal_period, @value);

这是经过测试的。它不会两次引用该表。我试图复制 MySQL 的 ON DUPLICATE KEY UPDATE。

于 2014-05-28T22:00:50.173 回答
1
MERGE CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
ON (SOURCE.colID = TARGET.colID) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);
于 2012-05-24T16:47:12.347 回答
1

无论该表是否包含记录,要在表中更新或插入,您可以按如下方式合并:

  • 确保USING子句返回一个条目
  • 在ON子句中表达匹配条件

在您的情况下(以下示例在 Oracle 上测试):

MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT 'OneEntry' FROM DUAL) AS SOURCE
ON (colID = 1 and ordID = 3) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);

大多数数据库都有一个允许任意 SELECT 的 DUMMY 表(上面,我使用 DUAL),但如果我们只使用您问题中提到的表,您可以例如替换

SELECT 'OneEntry' FROM DUAL

SELECT COUNT(*) FROM CSScolorOrders 
于 2020-10-27T11:39:52.947 回答