У меня есть запрос, который отлично работает в MySQL, но когда я запускаю его в Oracle, я получаю следующую ошибку:
Ошибка SQL: ORA-00933: команда SQL неправильно завершилась
00933. 00000 - «Команда SQL неправильно завершена»
Запрос:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
sql
oracle
inner-join
ora-00933
user169743
источник
источник
Ответы:
Этот синтаксис недопустим в Oracle. Ты можешь сделать это:
Или вы могли бы сделать это:
Это зависит от того, считается ли встроенное представление обновляемым в Oracle ( возможность обновления для второго оператора зависит от некоторых правил, перечисленных здесь ).
источник
Использовать это:
источник
merge into table 1 t
и так далее.ON
,trg
это псевдоним для главной таблицыtable1
(«внешняя» таблица по вашей логике) иsrc
ссылается наUSING
группу («внутренняя таблица» по вашей логике). Но да, возможно, на него можно было бы ссылаться лучше, но я был в состоянии следовать за этим.MERGE
сWHERE
пунктом:Вы нуждаетесь в
WHERE
предложении, потому что столбцы, на которые есть ссылки вON
предложении, не могут быть обновлены.источник
источник
Не используйте некоторые ответы выше.
Некоторые предлагают использовать вложенный SELECT, не делайте этого, это мучительно медленно. Если вам нужно обновить много записей, используйте объединение, так что-то вроде:
Смотрите эту ссылку для более подробной информации. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .
Кроме того, убедитесь, что во всех таблицах, к которым вы присоединяетесь, есть первичные ключи.
источник
Как указано здесь , общий синтаксис для первого решения, предложенного Тони Эндрюсом:
Я думаю, что это интересно, особенно если вы хотите обновить более одного поля.
источник
Этот следующий синтаксис работает для меня.
источник
SET
выполнялREPLACE
и я пытался очистить определенную строку в столбце - оказалось, что Oracle обрабатывает''
как ноль, и это поле не может быть обнулено. Я думал, что синтаксис просто обновляет временную таблицу вместо реальной, но я ошибся.Используя описание вместо desc для table2,
источник
Отлично работает оракул
источник
t1.First_Name = t2.FirstName, t1.Last_Name = t2.LastName
таблицу после сопоставления с ней в столбце «Имя пользователя» (t1.UserName = t2.UserName
), чтобы получить их имя из таблицы с именем UserInfo (select * from UserInfo) t2
). База данных была такой, где она использовала UserName в качестве первичного ключа для UserInfo везде вместо непосредственного размещения FirstName и LastName в таблице. Это исправлено!источник
источник
Просто для полноты и из-за того, что мы говорим об Oracle, это тоже может быть сделано:
источник
A и B - поля псевдонимов, вам не нужно указывать таблицу.
источник
источник