Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在MYSQl中更新重复行的值来插入重复行_Mysql_Sql_Duplicates - Fatal编程技术网

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

通过在MYSQl中更新重复行的值来插入重复行,mysql,sql,duplicates,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 AD

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

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; 但它不起作用。有人能帮我吗。

首先,我忽略了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年重复此插入。

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

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

这似乎是个好问题

试试这个:

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

这很好,但问题是我不确定哪一年有数据,哪一年没有。2009不是列值,而是行值。我们需要检查,如果2009年、2010年或2011年的任何一年都没有该值,请插入一个重复的行,第6列为zero@RockR . . . 那很好。此查询确定哪些行缺少2009的值;当我运行此查询时,它会给我以下错误-插入数据c1,c2,c3,c4,c5,c6通过c1,c2,c3,c4,c5=2009=0从数据组中选择c1,c2,c3,c5,0;1062-关键“部门”的重复条目“航空航天和国防航空航天和国防-EADS-2009-T后利润”@Rockr。问题是第四栏在小组里。太好了。。这很有魅力。非常感谢。我还有一个问题。。假设我已经在第5列中预先定义了p1、p2、p3在所有年份,比如200920102011年。如果数据可用,则其fyn,如果不可用,则应插入数据并将最后一列置为零。