2013-09-15 6 views
0

Мне нужно обновить несколько строк на основе значения в других строках с соответствующим идентификатором.Обновление нескольких строк на основе значений в других строках в одной таблице

Структура таблицы:

ID | Sub-ID | value 
---------------------------- 
1 |  1 | a 
1 |  2 | b 
1 |  3 | c 
2 |  1 | x 
2 |  2 | y 
2 |  3 | z 
3 |  1 | k 
3 |  2 | l 
3 |  3 | m 

мне нужно обновить значение SubID = 2 со значением SubID = 3 для конкретных идентификаторов (где ID в другой таблице)

Результат должен быть (основание по вышеуказанному):

ID | Sub-ID | value 
---------------------------- 
1 |  1 | a 
1 |  2 | c 
1 |  3 | c 
2 |  1 | x 
2 |  2 | y 
2 |  3 | z 
3 |  1 | k 
3 |  2 | m 
3 |  3 | m 

Каким будет наиболее эффективный способ его реализации?

Это то, что я прямо сейчас:

UPDATE data_tab tab1 
    SET (value) = 
      (SELECT tab2.value 
      FROM data_tab tab2 
      WHERE tab1.id = tab2.id 
       AND tab1.sub_id = 2 AND tab2.sub_id = 3 
      )  
WHERE EXISTS (SELECT 1 FROM ids_table 
       WHERE id = tab1.id) 

ответ

1

Ответ на ваш вопрос что-то вроде этого:

UPDATE data_tab tab1 
    SET value = (SELECT tab2.value 
       FROM data_tab tab2 
       WHERE tab1.id = tab2.id AND 
         tab2.sub_id = 3 
      ) 
    WHERE tab1.id in (select id from ids_table) and 
     tab1.sub_id = 2; 

Другими словами, ваш исходный запрос в порядке. Я думаю, что более эффективно переместить условие на sub_id = 2 во внешний запрос.

+0

_ "Мне нужно обновить значение Subid = 2 со значением Subid = 3 для конкретных идентификаторов (где ID в другая таблица) «_ – Ben

1

То, что вы сделали, выглядит хорошо; что бы вы ни делали, вам придется выполнять эти сканированные таблицы. Это может быть быстрее (и это выглядит чище), если вы используете MERGE заявление:

merge into data_tab o 
using (select id, value 
      from data_tab a 
      join ids_table b 
      on a.id = b.id 
     where a.subid = 3 
       ) n 
    on (o.id = n.id) 
when matched then 
     update 
     set o.value = n.value 
     where o.subid = 2 
+0

Может быть, я не понимаю OP правильно, но зачем вам« ROWID »? http://www.sqlfiddle.com/#!4/48575/11 –

+0

Неуловимая ошибка @ A.B.Cade; это обычно более эффективно в самообучении, но я не думал о предложениях WHERE ... – Ben

Смежные вопросы