【问题标题】:MYSQL Complex Update For Duplicate Rows重复行的 MYSQL 复杂更新
【发布时间】:2013-08-12 12:11:48
【问题描述】:

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

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、p3 或 p1、p2 甚至只是 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,则删除临时表;

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

【问题讨论】:

  • 此表中的唯一约束列是什么。例如,如果您要检查 Column1 中的 AD voor 2012 Column4 应该有 2012 Column6 应该有一个 0 值,那么 2012 年的其他列应该有 2011 年的列的重复?
  • 是的。确切地。如果数据不可用,它应该为 0。就像有些情况下 P1, P2 在第 5 列中可用,因此它应该通过复制剩余值并在最后一列中为零来插入所有年份的 p3。

标签: mysql sql duplicates


【解决方案1】:

假设 UNIQUE 约束为 (Column1,Column2,Column3,Column4,Column5)

CREATE TEMPORARY TABLE tmp LIKE your_table;

INSERT IGNORE INTO tmp (Column1,Column2,Column3,Column4,Column5,Column6)
SELECT t1.Column1,t2.Column2,t3.Column3,t4.Column4,t5.Column5, 0
FROM 
    (SELECT DISTINCT Column1 FROM your_table) as t1,
    (SELECT DISTINCT Column2 FROM your_table) as t2, 
    (SELECT DISTINCT Column2 FROM your_table) as t2, 
    (SELECT DISTINCT Column4 FROM your_table) as t4,
    (SELECT DISTINCT Column5 FROM your_table) as t5;

UPDATE tmp JOIN your_table ON
    tmp.Column1 = your_table.Column1
    tmp.Column2 = your_table.Column2 AND
    tmp.Column3 = your_table.Column3 AND
    tmp.Column4 = your_table.Column4 AND
    tmp.Column5 = your_table.Column5 AND
SET tmp.Column6 = your_table.Column6;

这应该会在 temp 表中为您提供所需的结果,然后您可以截断 your_table 并插入 temp 中的数据。

您也可以使用普通表而不是 temp 并在最后交换它们。

【讨论】:

  • 这让我的系统宕机了。它进入了一个无限循环。我有 12000 行可供使用....
  • 我添加了 select distinct 以稍微减少行数,但您要求的是 5 个字段的值的所有可能组合...
  • 我应该划分我的数据库并尝试..??还是因为我们使用了临时表,所以发生了这种情况。?
  • 运行SELECT COUNT(DISTINCT Column1)*COUNT(DISTINCT Column2)*COUNT(DISTINCT Column3)*COUNT(DISTINCT Column4)*COUNT(DISTINCT Column5) FROM your_table。这将为您提供所有组合的总行数。如果这太多了,您可能应该重新考虑您的方法。临时表能够保存与普通表一样多的行。
  • 这是你最终结果的行数。随着行数的增加,查询该表会变慢。我可能会误解您需要哪些行组合,这将生成所有 5 行的所有可能组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2011-09-21
  • 1970-01-01
  • 2013-08-30
  • 2021-12-14
  • 2014-03-08
相关资源
最近更新 更多