2011-04-07 3 views
46

У меня есть таблица, которая выглядит примерно такОбновление строки с данными из другой строки в той же таблице

ID | NAME | VALUE | 
---------------------------- 
1 | Test | VALUE1 | 
2 | Test2 | VALUE2 | 
1 | Test2 |   | 
4 | Test |   | 
1 | Test3 | VALUE3 | 

Я ищу способ обновления «test2» Значения и «Test» с данными из других строк в столбце «VALUE» с тем же «NAME» (идентификатор здесь не уникален, составной ключ ID и NAME делает строку уникальной). Например, на выходе я ищу это:

ID | NAME | VALUE | 
---------------------------- 
1 | Test | VALUE1 | 
2 | Test2 | VALUE2 | 
1 | Test2 | VALUE2 | 
4 | Test | VALUE1 | 
1 | Test3 | VALUE3 | 

Если бы это было в другой таблице я бы хорошо, но я в недоумении относительно того, как я могу ссылаться на разные строки в пределах тока таблица с тем же значением NAME.

Обновление

После изменения Manji запроса ниже запрос я использовал для рабочего раствора. Спасибо всем!

UPDATE data_table dt1, data_table dt2 
SET dt1.VALUE = dt2.VALUE 
WHERE dt1.NAME = dt2.NAME AND dt1.VALUE = '' AND dt2.VALUE != '' 
+0

Что-то нуб, но я уверен, что это может быть сделано с использованием временных таблиц. Выберите имена, где значение равно null в таблице temp, затем заполните значения, а затем заполните эти значения обратно в исходную таблицу, где совпадает имя. – bdares

+1

Не могли бы вы уточнить, как они берут данные из других строк? Из примера видно, что вы хотите, чтобы все те, у кого с тем же именем, было одинаковое значение VALUE, это правильно? Здесь имеет значение идентификатор? –

+0

@Gustav, я нашел решение (см. Ниже), но да, намерение состоит в том, чтобы те же столбцы одного и того же NAME имели одинаковое значение VALUE. ID не имеет значения – slick

ответ

59

Попробуйте это:

UPDATE data_table t, (SELECT DISTINCT ID, NAME, VALUE 
         FROM data_table 
         WHERE VALUE IS NOT NULL AND VALUE != '') t1 
    SET t.VALUE = t1.VALUE 
WHERE t.ID = t1.ID 
    AND t.NAME = t1.NAME 
+0

Возможно ли в mysql выбрать из таблицы, которую вы сейчас обновляете? – zerkms

+2

нет, это невозможно, но я выбираю временную таблицу 't1', которую я создаю из цели обновления. – manji

+0

хорошо, я все еще думаю, что ваш запрос не удастся. Ты это пробовал? – zerkms

3
Update MyTable 
Set Value = (
       Select Min(T2.Value) 
       From MyTable As T2 
       Where T2.Id <> MyTable.Id 
        And T2.Name = MyTable.Name 
       ) 
Where (Value Is Null Or Value = '') 
    And Exists (
       Select 1 
       From MyTable As T3 
       Where T3.Id <> MyTable.Id 
        And T3.Name = MyTable.Name 
       ) 
+0

что такое 'Test2' в' Update Test2' clause? – zerkms

+0

@zerkms - Реализовал, что он не говорил об обновлении одной таблицы от другой, а вместо этого обновлял ту же таблицу. – Thomas

+0

как в ответе manji Я думаю, что это не сработает (поскольку вы выбираете ту же таблицу, которую вы обновляете) – zerkms

13

Вот мое движение:

UPDATE test as t1 
    INNER JOIN test as t2 ON 
     t1.NAME = t2.NAME AND 
     t2.value IS NOT NULL 
SET t1.VALUE = t2.VALUE; 

EDIT: Удалены лишние t1.id != t2.id состояние.

0
UPDATE financialyear 
    SET firstsemfrom = dt2.firstsemfrom, 
     firstsemto = dt2.firstsemto, 
     secondsemfrom = dt2.secondsemfrom, 
     secondsemto = dt2.secondsemto 
    from financialyear dt2 
WHERE financialyear.financialyearkey = 141 
    AND dt2.financialyearkey = 140 
0

Если вам просто нужно вставить новую строку с данными из другого ряда,

insert into ORDER_ITEM select * from ORDER_ITEM where ITEM_NUMBER =123; 
Смежные вопросы