2010-03-19 2 views
1

В Oracle 10g, мне нужно обновить таблицу A с данными из таблицы B.Обновление таблицы с максимальной датой другой таблицы

Таблица А имеет МЕСТОНАХОЖДЕНИЕ, Trandate и STATUS.

Таблица B имеет определение местоположения, STATUSDATE и СТАТУС

мне нужно обновить столбец STATUS в таблице А с колонком STATUS из таблицы B, где STATUSDATE это максимальный срок ДО и в том числе Trandate для этого места (в основном, я получаю статус местоположения во время конкретной транзакции).

У меня есть процедура PL/SQL, которая сделает это, но я ЗНАЮ, что должен быть способ заставить ее работать с помощью аналитики, и я слишком долго стучал головой.

Спасибо!

ответ

2

это должно вам начать (Здесь функция MAX является агрегатной функцией, а не аналитическая функция):

UPDATE table_a 
    SET status = (SELECT MAX(table_b.status) 
         KEEP (DENSE_RANK FIRST ORDER BY table_b.statusdate DESC) 
        FROM table_b 
        WHERE table_a.location = table_b.location 
        AND table_b.statusdate <= table_a.trandate); 

Это обновит все строки в table_a, даже если нет до строки в table_b , обновив в этом случае статус NULL. Если вы хотите, чтобы обновить строки в table_a, которые имеют соответствующий матч в table_b вы можете добавить фильтр:

UPDATE table_a 
    SET status = (SELECT MAX(table_b.status) 
         KEEP (DENSE_RANK FIRST ORDER BY table_b.statusdate DESC) 
        FROM table_b 
        WHERE table_a.location = table_b.location 
        AND table_b.statusdate <= table_a.trandate) 
WHERE EXISTS (SELECT NULL 
       FROM table_b 
       WHERE table_a.location = table_b.location 
        AND table_b.statusdate <= table_a.trandate); 
0

Это версия с аналитической функцией. Он обновляет все строки таблицы_a, как показано. Чтобы обновить определенную строку, добавьте фильтр.

update table_a t1 set status = (
     select distinct 
       first_value(t2.status) over (partition by t1.location, t1.trandate order by t2.statusdate desc) 
     from temp_b t2 
     where t1.location = t2.location 
     and t2.statusdate <= t1.trandate); 
Смежные вопросы