Таблица 1:
id name desc
-----------------------
1 a abc
2 b def
3 c adf
Таблица 2:
id name desc
-----------------------
1 x 123
2 y 345
В Oracle SQL, как мне выполнить SQL- запрос на обновление, который может обновить таблицу 1 с таблицей 2 name
и desc
используя тот же id
? Таким образом, конечный результат, который я получил бы,
Таблица 1:
id name desc
-----------------------
1 x 123
2 y 345
3 c adf
Вопрос взят из обновления одной таблицы с данными из другой , но специально для оракула SQL.
sql
oracle
sql-update
Muhd
источник
источник
Ответы:
Это называется коррелированным обновлением
Предполагая, что объединение приводит к сохранению ключа, вы также можете
источник
WHERE EXISTS
предотвращает обновление строки,t1
если в ней нет соответствующей строкиt2
. Без этого каждая строкаt1
будет обновлена, а значения будут установлены на,NULL
если в ней нет подходящей строкиt2
. Как правило, это не то, что вы хотите, поэтомуWHERE EXISTS
обычно это необходимо.SELECT ... FROM t2
должен быть уникальный ряд. Это означает, что вы должны выбрать все поля, которые содержат уникальный ключ - неуникальный первичный ключ не является достаточным. Без уникальности вы сводитесь к чему-то вроде цикла @ PaulKarr - и если нет уникальной корреляции, то для каждой строки источника может быть обновлено более одной целевой строки.table2
) возвращает несколько строк для одного или несколькихtable1
значений, и Oracle не знает, какое из них вы хотите использовать. Обычно это означает, что вам нужно уточнить подзапрос, чтобы он возвращал одну отдельную строку.Попробуй это:
источник
table1
иtable2
являются одной и той же таблицей, просто позаботьтесь оON
-part иWHERE
-clause дляSELECT
-statement oftable2
!пытаться
источник
никогда не работал для меня, так как set ожидает только 1 значение - Ошибка SQL: ORA-01427: однострочный подзапрос возвращает более одной строки.
вот решение:
Именно так вы запускаете его на рабочем листе SQLDeveloper. Они говорят, что это медленно, но это единственное решение, которое помогло мне в этом деле.
источник
Здесь, кажется, еще лучший ответ с предложением «in», которое позволяет использовать несколько ключей для объединения :
Суть в том, что столбцы, которые вы хотите использовать в качестве ключа в круглых скобках в предложении where перед 'in', содержат оператор select с такими же именами столбцов в круглых скобках. где ( column1, column2 ) in ( выберите ( column1, column2 ) из таблицы, где «набор, который я хочу» );
источник
404
)Если ваша таблица t1 и ее резервная копия t2 имеют много столбцов, вот компактный способ сделать это.
Кроме того, моя связанная с этим проблема заключалась в том, что были изменены только некоторые столбцы, и многие строки не имели правок для этих столбцов, поэтому я хотел оставить их в покое - в основном восстановить подмножество столбцов из резервной копии всей таблицы. Если вы хотите просто восстановить все строки, пропустите предложение where.
Конечно, более простым способом было бы удалить и вставить как select, но в моем случае мне нужно было решение только с обновлениями.
Хитрость в том, что когда вы выбираете * из пары таблиц с повторяющимися именами столбцов, вторая получает имя _1. Итак, вот что я придумала:
источник
источник