PL / SQL Update Присоединиться? - PullRequest
9 голосов
/ 26 июля 2011

Я знаю, что в PL / SQL нет оператора Update-Join. Раньше я писал T-SQL.

У меня есть две таблицы.

Alex_Table1
---------------------------
PK         VAL
---------------------------
1          Value1
2          Value2
3          Value3


Alex_Table2
---------------------------
PK         VAL
---------------------------
1          Value1_2
3          Value3_2

Я хочу обновить VAL с Alex_Table2 до Alex_Table1, соединяясь по столбцу PK.

В T-SQL это просто

update t1 set t1.VAL = t2.VAL
from
    Alex_Table1 t1
    inner join Alex_Table2 t2 on t1.PK = t2.PK;

И результат, который я ожидал

Alex_Table1
---------------------------
PK         VAL
---------------------------
1          Value1_2
2          Value2
3          Value3_2

У меня вопрос, как это сделать в PL / SQL? Спасибо!

Обновление

Спасибо, Cybernate и ypercube дали мне два полезных решения. Они оба работают. Тем не менее, я хочу сообщить вам производительность между этими двумя утверждениями.

Моя фактическая таблица содержит 80 000 записей, и только 3000 требует обновления.

MERGE оператор занимает 0,533 секунды.

UPDATE EXISTS утверждение занимает более 3 минут (я не измерял фактическое время. Я завершил процесс через 3 минуты.)

Ответы [ 2 ]

19 голосов
/ 26 июля 2011

Используйте оператор MERGE:

MERGE INTO Alex_Table1 t1
USING Alex_Table2 t2
ON (t1.PK = t2.PK)
WHEN MATCHED THEN 
UPDATE SET t1.VAL = t2.VAL
6 голосов
/ 26 июля 2011
UPDATE Alex_Table1 t1
SET t1.VAL =
      ( SELECT t2.VAL 
        FROM Alex_Table2 t2
        WHERE t2.PK = t1.PK
      )
WHERE EXISTS
        ( SELECT *
          FROM Alex_Table2 t2
          WHERE t2.PK = t1.PK
        )

Это также работает (если (PK) является первичным ключом Alex_Table2):

UPDATE
  ( SELECT t1.VAL A, t2.VAL B
    FROM Alex_Table1 t1
      JOIN Alex_Table2 t2
        ON t2.PK = t1.PK
  )
SET A = B ;

Проверено на dbfiddle.uk .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...