INSERT SELECT ON DUPLICATE不更新

时间:2013-11-15 02:33:30

标签: mysql sql select insert on-duplicate-key

  1. 我想基于SUM TABLE_A CRITERIA XTABLE_B.total_x并插入SUM
  2. 我想基于TABLE_A CRITERIA Y TABLE_B.total_yTABLE_B.total_y并插入| year | month | type | total | --------------------------------------- | 2013 | 11 | down | 100 | | 2013 | 11 | down | 50 | | 2013 | 11 | up | 60 | | 2013 | 10 | down | 200 | | 2013 | 10 | up | 15 | | 2013 | 10 | up | 9 |
  3. 问题:第2步未更新CREATE TABLE `TABLE_B` ( `year` INT(4) NULL DEFAULT NULL, `month` INT(2) UNSIGNED ZEROFILL NULL DEFAULT NULL, `total_x` INT(10) NULL DEFAULT NULL, `total_y` INT(10) NULL DEFAULT NULL, UNIQUE INDEX `unique` (`year`, `month`) )
  4. LONG

    TABLE_A:数据

    INSERT INTO TABLE_B (
     `year`, `month`, `total_x`
    )
    SELECT 
      t.`year`, t.`month`,
      SUM(t.`total`) as total_x
    FROM TABLE_A t
    WHERE
      t.`type` = 'down'
    GROUP BY
      t.`year`, t.`month`
     ON DUPLICATE KEY UPDATE
      `total_x` = total_x
    ;
    

    TABLE_B:结构

    INSERT INTO TABLE_B (
     `year`, `month`, `total_y`
    )
    SELECT 
      t.`year`, t.`month`,
      SUM(t.`total`) as total_y
    FROM TABLE_A t
    WHERE
      t.`type` = 'up'
    GROUP BY
      t.`year`, t.`month`
     ON DUPLICATE KEY UPDATE
      `total_y` = total_y
    ;
    

    SQL:CRITERIA_X

    total_y

    SQL:CRITERIA_Y

    {{1}}

    第二个SQL(CRITERIA_Y)未按预期更新{{1}}。的 WHY吗

1 个答案:

答案 0 :(得分:2)

我会采取另一种方式

insert into TABLE_B (year, month, total_x, total_y)
select year, month
     , sum (case [type] when 'down' then [total] else 0 end) [total_x]
     , sum (case [type] when 'up' then [total] else 0 end) [total_y]
from TABLE_A
group by [year], [month]

或者使用两个子查询的方式是

insert into TABLE_B (year, month, total_x, total_y)
select coalesce(t1.year, t2.year) year
     , coalesce(t1.month, t2.month) month
     , t1.total_x total_x
     , t2.total_y total_y
from (select year, month, sum(total) total_x
         from TABLE_A where [type]='down') t1 
full outer join
     (select year, month, sum(total) total_y
         from TABLE_A where [type]='up') t2
     on t1.year = t2.year and t1.month = t2.month

或使用union

insert into TABLE_B (year, month, total_x, total_y)
select year, month, sum(total_x), sum(total_y)
from ( 
   select year, month, sum(total) total_x, 0 total_y
   from TABLE_A where [type]='down'
   group by year, month
   union
   select year, month, 0 total_x, sum(total) total_y
   from TABLE_A where [type]='up'
   group by year, month) t
group by year, month  

阅读关于INSERT的规范......在重复键更新时,我注意到了这一点:

  

如果...匹配多行,则只更新一行。通常,您应该尽量避免在具有多个唯一索引的表上使用ON DUPLICATE KEY UPDATE子句。

因此使用复合键的语法有点麻烦,我个人会避免使用它。