ВНУТРЕННЕЕ СОЕДИНЕНИЕ в ОБНОВЛЕНИИ sql для DB2 - PullRequest
12 голосов
/ 15 ноября 2010

Есть ли способ использовать объединения в операторах обновления для 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%'                             

Приветствия

Ответы [ 9 ]

8 голосов
/ 16 ноября 2010

Вы не говорите, на какую платформу вы нацеливаетесь. Однако, ссылаясь на таблицы как на файлы, я полагаю, что вы НЕ используете 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). Я не уверен, что это было сделано специально, но это может повлиять на ваше сравнение.

7 голосов
/ 15 ноября 2010

Объединения в операторах 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%'
6 голосов
/ 24 октября 2012

Попробуйте, а затем скажите мне результаты:

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) 
3 голосов
/ 28 мая 2012

Обновление до ответа https://stackoverflow.com/a/4184237/565525:

если вы хотите несколько столбцов , это может быть достигнуто следующим образом:

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

3 голосов
/ 05 апреля 2012

Вот хороший пример того, что я только что получил:

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
)
1 голос
/ 12 марта 2014

Просто для обновления только тех строк, которые соответствуют условиям, и во избежание обновления нулей в других строках:

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

0 голосов
/ 15 ноября 2016

за вас спрашивают

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)
) 
0 голосов
/ 15 ноября 2010

Справочная документация для оператора 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.Если совпадают несколько строк, это не сработает.

0 голосов
/ 15 ноября 2010

В стандартном 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передать в тест) почти наверняка будет работать на БД / 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...