通过在MYSQl中更新其值来插入重复行

时间:2013-08-12 10:36:01

标签: mysql sql duplicates

我有一个非常复杂的表格,如下所示: -

Snos   Column1 Column2 Column3 Column4 Column5 Column6
1      AD       AD1     C1      2011    P1     6435200
2      AD       AD1     C1      2010    P1     234
3      AD       AD1     C1      2009    P1     6435
4      BD       AD2     C2      2010    P2     198448333
5      CD       AD3     C3      2011    P3     194414870

现在,我需要处理一个应该复制行的查询,其中假设p2值不可用于该特定年份或2009年或2010年或2011年的任何一个,并将最后一列的值设置为零。

所以现在我的数据库看起来应该像 -

Snos   Column1 Column2 Column3 Column4 Column5 Column6
1      AD       AD1     C1      2011    P1     6435200
2      AD       AD1     C1      2010    P1     234
3      AD       AD1     C1      2009    P1     6435
4      AD       AD1     C1      2011    P2     0
5      AD       AD1     C1      2010    P2     0
6      AD       AD1     C1      2009    P2     0
7      AD       AD1     C1      2011    P3     0
8      AD       AD1     C1      2010    P3     0
9      AD       AD1     C1      2009    P3     0
10     BD       AD2     C2      2010    P2     198448333
11     BD       AD2     C2      2009    P2     0
12     BD       AD2     C2      2011    P2     0
13     BD       AD2     C2      2010    P1     0
14     BD       AD2     C2      2009    P1     0
15     BD       AD2     C2      2011    P1     0
16     BD       AD2     C2      2010    P3     0
17     BD       AD2     C2      2009    P3     0
18     BD       AD2     C2      2011    P3     0
19     CD       AD3     C3      2011    P3     194414870
20     CD       AD3     C3      2009    P3     0
21     CD       AD3     C3      2010    P3     0
22     CD       AD3     C3      2011    P1     0
23     CD       AD3     C3      2009    P1     0
24     CD       AD3     C3      2010    P1     0
25     CD       AD3     C3      2011    P2     0
26     CD       AD3     C3      2009    P2     0
27     CD       AD3     C3      2010    P2     0

我尝试使用像

这样的临时表

    CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE *Some Condition*;
    Some If Else
    Then
    UPDATE tmptable_1 SET Column6 = 0;
    INSERT INTO table SELECT * FROM tmptable_1;
    DROP TEMPORARY TABLE IF EXISTS tmptable_1;

但它不起作用。任何人都可以帮助我。

3 个答案:

答案 0 :(得分:2)

首先,我忽略了Snos列。这看起来像一个自动编号的标识列。对于这样的列,排序不应该有所不同。

这个想法是独立插入每组行(给定年份)。例如,以下查询查找2009年所需的行。这些行 - 按大多数列分组时 - 没有2009年的值:

insert into t(Column1, Column2, Column3, Column4, Column5, Column6)
    select Column1, Column2, Column3, 2009, Column5, 0
    from table t
    group by Column1, Column2, Column3, Column5
    having sum(Column4 = 2009) = 0;

您可以在2010年和2011年重复此插入。

答案 1 :(得分:1)

这似乎是一个很好的问题!

试试这个:

select C.c1,
       C.c2,
       C.c3,
       A.c4,
       D.c5,
       case when B.c6 is null then 0 
            else B.c6 
       end as c6 
from (select '2011' as c4
      union all 
      select '2010' as c4
      union all 
      select '2009' as c4
      ) A
inner join 
      (select distinct c5 from tablename) D
inner join 
      (
        select distinct c1,c2,c3
        from tablename
      ) C
left outer join 
      tablename B
  on  A.c4 = B.c4
 and  D.c5 = B.c5
 and  C.c1 = B.c1
 and  C.c2 = B.c2
 and  C.c3 = B.c3

答案 2 :(得分:0)

以下是您可以使用的查询示例:

insert into tablename (Column1, Column2, Column3, Column4, Column5, Column6) 
select "BD","AD2","C2", column4,"P2","0" 
from tablename where 
column4 in (select distinct column4 from test) 
and column4 not in (select distinct column4 from test where column5 = "P2");