Я пытаюсь поддерживать несколько баз данных для приложения, которое пишу.Приложение в основном использует Hibernate, но невероятно неэффективно перебирать миллионы строк и обрабатывать их по отдельности, когда оператор DML может обработать их за короткое время.Поэтому для определенных операций мне нужно отработать SQL.Я больше человек из MySQL, но у меня пока есть приложение, работающее с SQL Server и MySQL.Есть одна операция, которая поставила меня в тупик, и я просто не могу понять, как построить некоторые из запросов на обновление для Oracle.Я знаю, что это, вероятно, вопрос новичка в том, что касается Oracle, но я, должно быть, пропустил очевидные ответы, когда искал ....
Вот как я пишу этот тип запроса дляMySQL:
обновление table1 t1, table2 t2 set t1.colA = t2.colA, где t1.colB = t2.colB и t1.colC = t2.colC
MySQL имеет хорошую конструкцию, в которойВы можете просто указать все таблицы перед оператором 'set' с псевдонимами, что значительно упрощает остальную часть оператора.В SQL Server я использую update ... join, чтобы сделать то же самое.
В Oracle я пытался использовать 'update table1 set colA = (select ....) там, где существует (select....) синтаксис, но это не работает - он возвращает ошибку «подзапрос возвращает более одной строки».Я также пытался использовать слияние ... используя ... в синтаксисе, но это ошибки с "невозможно получить стабильный набор строк из исходных таблиц".
Чтобы более подробно объяснить, что я "Я пытаюсь достичь, у меня есть несколько запросов, некоторые из которых используют 2 таблицы, некоторые из них 3 таблицы.Самое сложное должно сделать это:
обновить tableA.colB со значением в tableC.colC, где tableA.colA = tableB.colA и tableB.colB = tableC.colB для всех совпадающих строк.В терминах данных это выглядит так (до и после):
Before:
Table A
-------
colA colB
1 NULL
2 NULL
3 NULL
4 NULL
Table B
-------
colA colB
1 A
2 A
3 B
4 B
Table C
-------
colB colC
A 15
B 20
After:
Table A
-------
colA colB
1 15
2 15
3 20
4 20
Надеюсь, это достаточно ясно.Может кто-нибудь объяснить, как написать этот вид DML-запроса для Oracle?Что касается бонусных баллов, будет ли это так же для PostgreSQL?:)