【问题标题】:INSERT ON DUPLICATE KEY: Add values togetherINSERT ON DUPLICATE KEY:将值相加
【发布时间】:2017-12-14 17:12:41
【问题描述】:

我需要更改包含 datesamounts 的 SQL 表的日期列,例如2017010120170102。但是,新日期20170102 可能已经存在。这会导致重复键错误,因为日期列是唯一索引的一部分。

我的第一个想法是使用 INSERT ON DUPLICATE KEY:

INSERT INTO table (Date, Amount)
SELECT '20170102', Amount
FROM table
WHERE Date = '20170101'
ON DUPLICATE KEY UPDATE Amount = OldAmount + NewAmount

Amount = OldAmount + NewAmount 部分显然无法工作。但是我该如何解决我的问题呢?

【问题讨论】:

  • mysqltsql 标签通常是不兼容的。请使用适当的软件(MySQL、Oracle、DB2...)和版本标记您的问题,例如sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql 缩小了选择范围,但没有指定数据库。
  • this 问题有帮助吗?
  • 合并命令应该可以让你到达那里

标签: tsql insert sql-update sql-server-2014 on-duplicate-key


【解决方案1】:

这是你的答案:假设旧表 TABLE1 (DATE1 DATE PRIMARY KEY, AMOUNT INT);

  1. 将新列 Date2 添加为 DATE:

    ALTER TABLE TABLE1 添加列 DATE2 日期;

  2. 按旧日期生成所有 DATE2;

    UPDATE TABLE1 设置 DATE2=DATE1; -- OLD 列 DATE1 或 DATE

  3. UPDATE DATE2 你要更新哪条记录的日期

    UPDATE TABLE1 SET DATE2='20170101' where DATE1='20170102'; -- 假设 20170101 已经存在

  4. 获取添加金额的记录

    SELECT DATE2,sum(AMOUNT) from TABLE1 group by 1; -- 这将显示所有带有 sum 的记录

  5. 您可以创建新表 TABLE2 并插入这些记录:

    CREATE TABLE TABLE2 (DATE1 DATE PRIMARY KEY, AMOUNT int); INSERT INTO TABLE2 SELECT DATE2, SUM(AMOUNT) FROM TABEL1 GROUP BY 1;

【讨论】:

    【解决方案2】:

    如果您使用的是 SQL Server,请尝试使用合并语句。

    澄清一下 - 您需要更改表中记录的日期还是只是添加新记录?

    CREATE TABLE #DataTable
    (
        SomeDate DATE,
        Amount INT
    )
    
    INSERT #DataTable
    VALUES
    ('20170101', 1),
    ('20170206', 2),
    ('20170309', 3),
    ('20170422', 4),
    ('20170518', 5)
    
    DECLARE @NewValues TABLE
    (
        SomeDate DATE,
        Amount INT
    )
    
    INSERT @NewValues
    VALUES
    ('20170101', 10), --Update
    ('20170309', 15), --Update
    ('20170612', 6), --Insert
    ('20170725', 7) --Insert
    
    MERGE INTO #DataTable AS tgt
    USING @NewValues AS nv
        ON  nv.SomeDate = tgt.SomeDate
    WHEN NOT MATCHED THEN INSERT
    VALUES
    (nv.SomeDate, nv.Amount)
    WHEN MATCHED THEN UPDATE
    SET tgt.Amount = tgt.Amount + nv.Amount
    OUTPUT  $action AS MergeAction, 
            Inserted.SomeDate, 
            Deleted.Amount AS OldValue, 
            Inserted.Amount AS NewValue;
    
    DROP TABLE #DataTable;
    

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2013-10-03
      • 2022-08-02
      • 2011-01-29
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2011-06-03
      相关资源
      最近更新 更多