Я пытаюсь создать запрос на обновление, который объединяет 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;
Тем не менее, я получаю сообщение об ошибке из приведенного выше запроса, говорящего «недопустимое количество аргументов». Любая идея, что я делаю неправильно? или как я могу сделать это лучше?
CONCAT
принимает только два параметра, а это значит, что вы должны использовать вложенные CONCAT
s.
Тем не менее, вы бы предпочли использовать оператор двойной трубы ||
, который не имеет такого ограничения. Так:
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 ...
Я добавил еще несколько примеров; Посмотрите, пожалуйста.
из обновления я получил следующее "подзапрос с одной строкой возвращает более одной строки"... из слияния я получил следующую ошибку "невозможно получить стабильный набор строк в исходных таблицах"...
Это потому, что есть дубликаты; Идентификаторы не уникальны. Попробуйте добавить DISTINCT, может поможет. Добавил и эти примеры.
хорошо, это устранило проблему с обновлением файла concat. однако, как я могу расширить это, чтобы обновить всю таблицу. вместо A.id=12... пробовал A.id=B.id; но выдает ошибку. Любая идея, как заставить его обновить все?