提问者:小点点

重复行的MYSQL复杂更新


我有一张非常复杂的表格,是这样的:-

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、p3或p1、p2甚至仅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;

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


共1个答案

匿名用户

假设UNIQUE约束是on(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,并在结束时交换它们。