Заявление об обновлении Oracle - как вы ссылаетесь на связанные таблицы? - PullRequest
1 голос
/ 07 октября 2010

Я относительно новичок в Oracle, большую часть своей карьеры работал над MS SQL. Я привык делать такие вещи, как:

update t
set Col1 = o.Col2
from MyTable t 
join OtherTable o on t.OtherID = o.ID

Я попробовал этот синтаксис в Oracle, и он не принимает его. Посмотрел в Oracle docs и не смог найти пример того, что я пытаюсь сделать.

Как ты это делаешь?

Ответы [ 5 ]

3 голосов
/ 07 октября 2010

Вариант А) Коррелированный подзапрос

UPDATE MyTable t
  SET Col1 = (SELECT o.col2 FROM OtherTable o WHERE t.OtherID = o.ID)

Для этого требуется, чтобы подзапрос возвращал не более 1 совпадения для каждой строки в обновляемой таблице. Если он не найдет совпадений, столбец будет обновлен до NULL, что может быть не тем, что вы хотите. Вы можете добавить WHERE EXISTS (SELECT o.col2 FROM OtherTable o WHERE t.OtherID = o.ID), чтобы обновление происходило только при обнаружении совпадения.

Вариант Б) Обновление вида объединения

UPDATE (SELECT t.col1, o.col2 FROM MyTable t JOIN OtherTable o ON t.otherID = o.ID)
  SET col1 = col2

Это ближе к тому, что вы привыкли делать. Это будет работать только в том случае, если Oracle сможет определить уникальную строку в базовой таблице для каждой строки в соединении, что, как я думаю, в основном означает, что ID должен быть уникальным ключом otherTable.

2 голосов
/ 07 октября 2010
update (select t.OtherID, t.Col1  , o.ID, o.Col2 from MyTable t 
join OtherTable o on t.OtherID = o.ID) a
set a.Col1 = a.Col2
1 голос
/ 07 октября 2010

Вы можете использовать временную таблицу следующим образом:

update
(
    select t.Col1, o.Col2
    from MyTable t
    join OtherTable o
        on t.OtherID = o.ID
) tmp
set tmp.Col1 = tmp.Col2
1 голос
/ 07 октября 2010
update MyTable t
set Col1 = (SELECT o.Col2 from OtherTable o
            WHERE t.OtherID = o.ID)
where exists (SELECT o.Col2 from OtherTable o
            WHERE t.OtherID = o.ID)

Часть «где существует» предназначена для предотвращения установки для col1 значения NULL для строк MyTable, которые не совпадают в OtherTable, - при условии, что это может произойти и это необходимо предотвратить.

0 голосов
/ 07 октября 2010
update MyTable t
set Col1 = (SELECT o.Col2 from OtherTable o
            WHERE t.OtherID = o.ID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...