INNER JOIN в UPDATE sql для DB2
Есть ли способ использовать объединения в операциях обновления для DB2?
Google действительно подвел меня на этот
Это примерно то, что я пытаюсь достичь (... кроме явно работающих...)
update file1 inner join file2
on substr(file1.firstfield,10,20) = substr(file2.anotherfield,1,10)
set file1.firstfield = ( 'BIT OF TEXT' concat file2.something )
where file1.firstfield like 'BLAH%'
Приветствия
Ответы
Ответ 1
Вы не говорите, на какой платформе вы нацеливаетесь. Однако ссылаясь на таблицы как на файлы, я полагаю, что вы не используете DB2 в Linux, UNIX или Windows (LUW).
Однако, если вы находитесь в DB2 LUW, см. оператор MERGE:
В примере вашего примера это будет написано как:
merge into file1 a
using (select anotherfield, something from file2) b
on substr(a.firstfield,10,20) = substr(b.anotherfield,1,10)
when matched and a.firstfield like 'BLAH%'
then update set a.firstfield = 'BIT OF TEXT' || b.something;
Обратите внимание: для DB2 третий аргумент функции SUBSTR - это количество возвращаемых байтов, а не конечная позиция. Поэтому SUBSTR (a.firstfield, 10,20) возвращает CHAR (20). Однако SUBSTR (b.anotherfield, 1,10) возвращает CHAR (10). Я не уверен, что это было сделано специально, но это может повлиять на ваше сравнение.
Ответ 2
Соединения в операторах update
являются нестандартными и не поддерживаются всеми поставщиками. То, что вы пытаетесь сделать, может быть выполнено с помощью подвыбора:
update
file1
set
firstfield = (select 'stuff' concat something from file2 where substr(file1.field1, 10, 20) = substr(file2.xxx,1,10) )
where
file1.foo like 'BLAH%'
Ответ 3
Попробуйте это, а затем скажите мне результаты:
UPDATE File1 AS B
SET b.campo1 = (SELECT DISTINCT A.campo1
FROM File2 A
INNER JOIN File1
ON A.campo2 = File1.campo2
AND A.campo2 = B.campo2)
Ответ 4
Имел подобную проблему, DB2 не поддерживает UPDATE, используя подвыбор и где. Я закончил использовать команду MERGE;
оператор MERGE
Оператор MERGE обновляет цель (таблицу или представление или базовые таблицы или представления полного набора), используя данные из источника (результат ссылки на таблицу). Строки в целевом объекте, которые соответствуют источнику, могут быть удалены или обновлены, как указано, и строки, которые не существуют в целевой, могут быть вставлены. Обновление, удаление или вставка строки в представлении обновляет, удаляет или вставляет строку в таблицы, на которых основано представление.
Ответ 5
Вот хороший пример того, что я только что получил:
update cac c
set ga_meth_id = (
select cim.ga_meth_id
from cci ci, ccim cim
where ci.cus_id_key_n = cim.cus_id_key_n
and ci.cus_set_c = cim.cus_set_c
and ci.cus_set_c = c.cus_set_c
and ci.cps_key_n = c.cps_key_n
)
where exists (
select 1
from cci ci2, ccim cim2
where ci2.cus_id_key_n = cim2.cus_id_key_n
and ci2.cus_set_c = cim2.cus_set_c
and ci2.cus_set_c = c.cus_set_c
and ci2.cps_key_n = c.cps_key_n
)
Ответ 6
Обновить ответ fooobar.com/questions/427997/...:
если вы хотите несколько столбцов, которые можно выполнить следующим образом:
update file1
set
(firstfield, secondfield) = (
select 'stuff' concat 'something from file2',
'some secondfield value'
from file2
where substr(file1.field1, 10, 20) = substr(file2.xxx,1,10) )
where
file1.foo like 'BLAH%'
Источник: http://www.dbforums.com/db2/1615011-sql-update-using-join-subquery.html#post6257307
Ответ 7
Просто обновить только строки, соответствующие условиям, и не обновлять значения нулей в других строках:
update table_one set field_1 = 'ACTIVE' where exists
(select 1 from table_two where table_one.customer = table_two.customer);
Он работает в DB2/AIX64 9.7.8
Ответ 8
В справочной документации для инструкции UPDATE в DB2 LUW 9.7 приведен пример:
UPDATE (SELECT EMPNO, SALARY, COMM,
AVG(SALARY) OVER (PARTITION BY WORKDEPT),
AVG(COMM) OVER (PARTITION BY WORKDEPT)
FROM EMPLOYEE E) AS E(EMPNO, SALARY, COMM, AVGSAL, AVGCOMM)
SET (SALARY, COMM) = (AVGSAL, AVGCOMM)
WHERE EMPNO = '000120'
Скобки после UPDATE могут содержать полный выбор, что означает, что любой действительный оператор SELECT может туда попасть.
Исходя из этого, я бы предложил следующее:
UPDATE (
SELECT
f1.firstfield,
f2.anotherfield,
f2.something
FROM file1 f1
WHERE f1.firstfield like 'BLAH%'
INNER JOIN file2 f2
ON substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
)
AS my_files(firstfield, anotherfield, something)
SET
firstfield = ( 'BIT OF TEXT' || something )
Изменить: Ян прав. Мой первый инстинкт состоял в том, чтобы вместо этого использовать подзапросы:
UPDATE file1 f1
SET f1.firstfield = ( 'BIT OF TEXT' || (
SELECT f2.something
FROM file2 f2
WHERE substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
))
WHERE f1.firstfield LIKE 'BLAH%'
AND substr(f1.firstfield,10,20) IN (
SELECT substr(f2.anotherfield,1,10)
FROM file2 f2
)
Но я не уверен, будет ли конкатенация работать. Он также предполагает, что между подстроками имеется отображение 1:1. Если несколько строк соответствуют друг другу, это не сработает.
Ответ 9
для вас спросите
update file1 f1
set file1.firstfield=
(
select 'BIT OF TEXT' || f2.something
from file2 f2
where substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
)
where exists
(
select * from file2 f2
where substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
)
and f1.firstfield like 'BLAH%'
Если соединение дает несколько результатов, вы можете принудительно обновить это значение
update file1 f1
set file1.firstfield=
(
select 'BIT OF TEXT' || f2.something
from file2 f2
where substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
fetch first rows only
)
where exists
(
select * from file2 f2
where substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
)
and f1.firstfield like 'BLAH%'
шаблонный метод
update table1 f1
set (f1.field1, f1.field2, f1.field3, f1.field4)=
(
select f2.field1, f2.field2, f2.field3, 'CONSTVALUE'
from table2 f2
where (f1.key1, f1.key2)=(f2.key1, f2.key2)
)
where exists
(
select * from table2 f2
where (f1.key1, f1.key2)=(f2.key1, f2.key2)
)
Ответ 10
В стандартном SQL этот тип обновления выглядит следующим образом:
update a
set a.firstfield ='BIT OF TEXT' + b.something
from file1 a
join file2 b
on substr(a.firstfield,10,20) =
substr(b.anotherfield,1,10)
where a.firstfield like 'BLAH%'
С незначительными синтаксическими вариациями этот тип вещей будет работать на Oracle или SQL Server и (хотя у меня нет экземпляра DB/2 для тестирования) почти наверняка будет работать на DB/2.