0

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

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,则删除临时表;

但它不工作。谁能帮我。

4

1 回答 1

0

假设 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;

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

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

于 2013-08-12T13:15:37.050 回答