Оператор обновления с внутренним объединением на Oracle

У меня есть запрос, который хорошо работает в MySQL, но когда я выполняю его на Oracle, я получаю следующую ошибку:

Ошибка SQL: РТЫ 00933: команда SQL, не правильно законченная
00933. 00000 - "команда SQL, не правильно законченная"

Запрос:

UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
280
задан Alexis Dufrenoy 19 November 2018 в 23:39
поделиться

4 ответа

Этот синтаксис недопустим в Oracle. Вы можете сделать это:

UPDATE table1 SET table1.value = (SELECT table2.CODE
                                  FROM table2 
                                  WHERE table1.value = table2.DESC)
WHERE table1.UPDATETYPE='blah'
AND EXISTS (SELECT table2.CODE
            FROM table2 
            WHERE table1.value = table2.DESC);

Или вы могли бы сделать это:

UPDATE 
(SELECT table1.value as OLD, table2.CODE as NEW
 FROM table1
 INNER JOIN table2
 ON table1.value = table2.DESC
 WHERE table1.UPDATETYPE='blah'
) t
SET t.OLD = t.NEW

Это зависит от того, считается ли встроенное представление обновляемым Oracle ( Чтобы быть обновляемым для второе утверждение зависит от некоторых правил, перечисленных здесь ).

385
ответ дан 23 November 2019 в 02:00
поделиться

Используя описание вместо desc для table2,

update
  table1
set
  value = (select code from table2 where description = table1.value)
where
  exists (select 1 from table2 where description = table1.value)
  and
  table1.updatetype = 'blah'
;
2
ответ дан 23 November 2019 в 02:00
поделиться
 UPDATE ( SELECT t1.value, t2.CODE
          FROM table1 t1
          INNER JOIN table2 t2 ON t1.Value = t2.DESC
          WHERE t1.UPDATETYPE='blah')
 SET t1.Value= t2.CODE
13
ответ дан 23 November 2019 в 02:00
поделиться

Используйте это:

MERGE
INTO    table1 trg
USING   (
        SELECT  t1.rowid AS rid, t2.code
        FROM    table1 t1
        JOIN    table2 t2
        ON      table1.value = table2.DESC
        WHERE   table1.UPDATETYPE='blah'
        ) src
ON      (trg.rowid = src.rid)
WHEN MATCHED THEN UPDATE
    SET trg.value = code;
196
ответ дан 23 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: