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

Posted

技术标签:

【中文标题】通过在 MYSQl 中更新其值来插入重复行【英文标题】:Inserting Duplicate rows by updating its value in MYSQl 【发布时间】:2013-08-12 10:36:00 【问题描述】:

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

Snos 列 1 列 2 列 3 列 4 列 5 列 6 1 公元 AD1 C1 2011 P1 6435200 2 公元 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 列 1 列 2 列 3 列 4 列 5 列 6 1 公元 AD1 C1 2011 P1 6435200 2 公元 AD1 C1 2010 P1 234 3 AD AD1 C1 2009 P1 6435 4 公元 AD1 C1 2011 P2 0 5 公元 AD1 C1 2010 P2 0 6 公元 AD1 C1 2009 P2 0 7 公元 AD1 C1 2011 P3 0 8 公元 AD1 C1 2010 P3 0 9 公元 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*; 一些如果其他 然后 更新 tmptable_1 SET Column6 = 0; 插入表 SELECT * FROM tmptable_1; 如果存在 tmptable_1,则删除临时表;

但它不起作用。谁能帮帮我。

【问题讨论】:

【参考方案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 年重复此插入。

【讨论】:

这很好,但问题是我不确定哪一年的数据存在,哪一年不存在。并且 2009 不是列值,而是行值。我们需要检查一下,如果 2009 年或 2010 年或 2011 年的任何一年的值都不存在,则插入重复行,第 6 列为零 @RockR 。 . .没事儿。此查询确定哪些行缺少 2009 年的值;然后它会插入它们。 运行此查询时出现以下错误 - 插入数据(c1、c2、c3、c4、c5、c6)选择 c1、c2、c3、2009、c5、0 from c1、c2、c3、c4、c5 的数据组 sum(c4 = 2009) = 0; #1062 - 重复条目 'Aerospace & Defence-Aerospace & Defence-EADS-2009-Profit after T' 键'Sector' @Rockr 。 . .问题是 column4 在 group by. 太棒了..这就像魅力一样。谢谢......我还有另一个问题......就像假设我已经预定义在第 5 列中,我将在 2009、2010、2011 等所有年份中拥有 p1、p2、p3。如果数据可用,它的 fyn ,如果不是,它应该插入它并将最后一列设置为零。【参考方案2】:

这似乎是个好问题!

试试这个:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于通过在 MYSQl 中更新其值来插入重复行的主要内容,如果未能解决你的问题,请参考以下文章

nodejs mysql批量插入重复密钥更新

为mysql中的每个查询结果在表中插入行[重复]

如何在更新和插入并发时避免重复行

一行列表视图正在更新,但也插入了重复行

MySQL重复键更新+受影响的行数

Mysql 存在既更新,不存在就添加(sql语句)