2013-08-12 4 views
0

у меня есть очень сложный стол, который выглядит так: -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; 

но не работает. Может кто-нибудь мне помочь.

+0

Каковы уникальные столбцы ограничений в этой таблице. Например, если вы проверили бы AD до 2012 года в столбце 1, то столбец 4 должен иметь значение 2012 года в столбце 6, а остальные столбцы на 2012 год должны иметь дублирование столбцов с 2011 года? –

+0

Да. В точку. Он должен иметь 0, если данные недоступны. Подобно случаям, когда P1, P2 доступны в столбце 5, поэтому он должен вставлять p3 в течение всех лет, дублируя значение остатка и имея нуль в последнем столбце. – Rockr

ответ

0

Предполагая, что ограничение уникальности на (column1, Столбец2, Столбец3, 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 и поменять их в конце.

+0

Это сняло мою систему. Он прошел в бесконечный цикл. У меня есть 12000 строк для работы с ... – Rockr

+0

Я добавил выделение, чтобы немного сократить количество строк, но вы запрашиваете все возможные комбинации значений 5 полей ... – Vatev

+0

Я должен разделить мою базу данных и ден попробуй .. ?? или это потому, что мы использовали временную таблицу, это произошло. – Rockr