2013-03-21 2 views
0

В настоящее время я создаю инструкцию по обновлению, которая будет обновлять bitemporal таблицу. Он выполняет следующие действия:Повторяющийся подзапрос в DB2 update

Обновите каждую строку для каждого идентификатора и установите RELATION_ID в RELATION_ID новой строки.

В этом запросе имеется повторяющаяся подзапрос (Потому что я первым использовать его, чтобы получить значение, используемое для обновления), а также (я не хочу обновлять строки, которые уже имеют этот RELATION_ID)

Есть способ повторно использовать значение из первого запроса или какие-либо альтернативы (без программирования, чистый SQL требуется)

UPDATE TBL_CLIENT UPD 
SET RELATION_ID = (
        SELECT RELATION_ID FROM TBL_CLIENT SUBQ 
        WHERE UPD.ID = SUBQ.ID AND 
         UPDATE_TIMESTAMP = (
              SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT SUBSQ 
              WHERE SUBSQ.ID = SUBQ.ID 
              ) 
       )    
WHERE ID IN ( 
        SELECT ID 
        FROM TBL_CLIENT QU 
        GROUP BY ID 
        HAVING COUNT(DISTINCT(RELATION_ID)) > 1 
        ) AND   
     RELATION_ID <> (
         SELECT RELATION_ID FROM TBL_CLIENT SUBQ2 
         WHERE UPD.ID = SUBQ2.ID AND 
           UPDATE_TIMESTAMP = (
                -- Update mit STID des neusten Eintrages 
                SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT SUBSQ2 
                WHERE SUBSQ2.ID = SUBQ2.ID 
               ) 
        ) 

Пример:

ID/RELATION_ID/UPDATE_TIMESTAMP

  • 1/10/1.1.2000
  • 1/12/5.1.2002
  • 1/15/28.3.2008

После обновления:

  • 1/15/1.1.2000
  • 1/15/5.1.2002
  • 1/15/28.3.2008

Последняя строка была последняя строка, поэтому это отношение идентификатор было принято (и сама строка не была обновлена ​​!, важно для другой части запроса, который не входит сюда)

Спасибо для любых рекомендаций

+0

Совет должен заменить 'update' на' merge'. , , http://stackoverflow.com/questions/4184209/inner-join-in-update-sql-for-db2. –

+0

Что является основным ключом таблицы? –

+0

Первичный ключ состоит из множества элементов, включая идентификатор, временную метку, но не Relation_Id – Xavjer

ответ

0

Вы можете обновить вид:

UPDATE 
    (SELECT t.id, t.update_timestamp, ...  --- all the PK columns 
      t.relation_id, 
      m.relation_id AS new_relation_id 
    FROM 
     TBL_CLIENT AS t 
     JOIN 
     (SELECT id, relation_id, 
       ROW_NUMBER() OVER (PARTITION BY id 
            ORDER BY update_timestamp DESC) 
        AS rn 
      FROM TBL_CLIENT 
     ) AS m 
     ON m.id = t.id 
    WHERE m.rn = 1 
     AND m.relation_id <> t.relation_id 
) AS upd 
SET 
    relation_id = new_relation_id ; 
+0

Изменение вашего JOIN с моей частью для max tsd, выбор возвращает все значения, которые мне нужны, но я не могу заставить его работать как обновление:/ – Xavjer

+0

Не работает ли мой ответ? Какую версию DB2 вы используете? –

+0

См. Редактирование. Вероятно, вам придется включить ПК. –

0

Это может сработать для вас - (я не знаю точного синтаксиса. я работаю на Sybase, так что это, как в Sybase)

UPDATE TBL_CLIENT AA 
    SET RELATION_ID = BB.RELATION_ID 
FROM 
    TBL_CLIENT AA, 
    TBL_CLIENT BB 
WHERE 
    AA.ID=BB.ID 
    AND BB.UPDATE_TIMESTAMP=(SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT CC WHERE CC.ID=BB.ID) 
+0

, или предоставить образцы данных и ожидаемый результат, который вы хотите – DSD

+0

На самом деле, невозможно определить более одной таблицы в обновлении в DB2, FROM утверждение там не существует, было бы хорошим решением, если бы это было возможно. Будет обновлен мой пост с помощью небольшого примера. – Xavjer

-1

Вероятно, вы можете использовать триггер с после/перед обновлением.

Смежные вопросы