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

Я пытаюсь создать запрос на обновление, который объединяет 3 поля из таблицы с 1 полем в другой таблице.

Первая таблица с именем table1

ID       DESC
12       left:Middle:Right

Вторая таблица Таблица 2

ID  FLD1    FLD2    FLD3
12  left    Middle  Right

Попытка обновить все поле описания в таблице 1 со значениями таблицы 2, где table1.id = table2.id

update table1 A SET A.DESC = (SELECT CONCAT(B.fld1, ':', B.fld2, ':', B.fld3) 
                              from table2 B 
                              where A.ID = B.ID) 
Where A.id = 12;

Тем не менее, я получаю сообщение об ошибке из приведенного выше запроса, говорящего «недопустимое количество аргументов». Любая идея, что я делаю неправильно? или как я могу сделать это лучше?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
321
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

CONCAT принимает только два параметра, а это значит, что вы должны использовать вложенные CONCATs.

Тем не менее, вы бы предпочли использовать оператор двойной трубы ||, который не имеет такого ограничения. Так:

update table1 A SET A.DESC = (SELECT B.fld1 ||':'|| B.fld2 ||':'|| B.fld3   --> this
                              from table2 B 
                              where A.ID = B.ID) 
Where A.id = 12;

Чтобы обновить все совпадающие строки, вы можете

update table1 A SET A.DESC = (SELECT B.fld1 ||':'|| B.fld2 ||':'|| B.fld3   --> this
                              from table2 B 
                              where A.ID = B.ID) 
Where exists (select null
              from table2 b
              where a.id = b.id);

или MERGE:

merge into table1 a
  using table2 b
  on (b.id = a.id)
  when matched then update set a.desc = b.fld1 ||':'|| b.fld2 ||':'|| b.fld3;

Поскольку у вас есть дубликаты, DISTINCT может помочь, например.

update table1 a set 
  a.desc = (select distinct b.fld1 ||':'|| b.fld2 ||':'|| b.fld3
            from table2 b
            where a.id = b.id
           )
where exists ...

Если нет, то вам придется посмотреть, что делать с этими дубликатами. Если возможно, используйте еще один столбец (столбцы) в предложении WHERE. Или, если вам все равно, какая объединенная комбинация подходит, используйте агрегатные функции, такие как MIN или MAX, например.

update table1 a set 
  a.desc = (select max(b.fld1 ||':'|| b.fld2 ||':'|| b.fld3)
            from table2 b
            where a.id = b.id
           )
where exists ...

хорошо, это устранило проблему с обновлением файла concat. однако, как я могу расширить это, чтобы обновить всю таблицу. вместо A.id=12... пробовал A.id=B.id; но выдает ошибку. Любая идея, как заставить его обновить все?

Natalie Nicholas 10.12.2020 20:19

Я добавил еще несколько примеров; Посмотрите, пожалуйста.

Littlefoot 10.12.2020 21:17

из обновления я получил следующее "подзапрос с одной строкой возвращает более одной строки"... из слияния я получил следующую ошибку "невозможно получить стабильный набор строк в исходных таблицах"...

Natalie Nicholas 10.12.2020 21:26

Это потому, что есть дубликаты; Идентификаторы не уникальны. Попробуйте добавить DISTINCT, может поможет. Добавил и эти примеры.

Littlefoot 10.12.2020 21:28

Другие вопросы по теме