【问题标题】:SQL merge command on one table一张表上的 SQL 合并命令
【发布时间】:2012-05-31 06:44:40
【问题描述】:

我正在努力理解MERGE sql 语句。我想要实现的是:

CSScolorOrders 表中插入新值,但如果colIDordID 的记录已经存在,则更新corQuantity

这就是我最终的结果:

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);

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

【问题讨论】:

  • @Sebas 这是 SQL 2K8。这是 T-SQL 特定语法 AFAIK。
  • 我明白了,很抱歉,我当时以为我可以暂时伸出援手,但很遗憾没有。 rgds.

标签: sql sql-server-2008 merge


【解决方案1】:

正如here 所讨论的,您会看到合并与听起来完全一样。取两个表并搜索您加入它们的值,我们称之为“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% 确定您的表列是什么以及您尝试加入的具体内容。但我提供的链接应该为您指明正确的方向。

希望这会有所帮助!

【讨论】:

    【解决方案2】:
    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。

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

        【解决方案4】:

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

        • 确保 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 
        

        【讨论】:

          猜你喜欢
          • 2016-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-22
          • 2014-06-26
          • 2014-10-04
          相关资源
          最近更新 更多