2015-12-02 4 views
1

У меня есть данные в следующем виде:Oracle: Обновление строки на основе значения столбца

ORDER_NO FULFILL_ID SOURCE_LOC ITEM 
    100     11001  0021 
    100     11001  0031 
    100     12001  0014 
    100     13001  0053 

Всякий раз, когда source_loc такое же, он должен давать один и тот же fulfill_id. Идентификаторы должны начинаться с 1 и увеличивается на 1 .. Таким образом, данные должны быть обновление в

ORDER_NO FULFILL_ID SOURCE_LOC ITEM 
    100   1   11001  0021 
    100   1   11001  0031 
    100   2   12001  0014 
    100   3   13001  0053 

Как обновить столбец?

+0

Хотите сохранить это значение FULFILL_ID в таблице? Это немного опасно, вот как вы получаете несогласованность данных, когда строка вставлена ​​/ обновлена ​​/ удалена. Создайте представление вместо этого. (Или использовать триггеры.) – jarlh

ответ

3

Это может быть сделано с помощью одного оператора MERGE:

merge into orders o 
using 
(
    select order_no, 
     dense_rank() over (order by source_loc) as rn, 
     source_loc, 
     item 
    from orders 
) t on (o.order_no = t.order_no and o.item = t.item and o.source_loc = t.source_loc) 
when matched then update 
    set fullfill_id = rn; 

вопрос: почему вы должны сохранить эту информацию, если это легко можно вычислить во время выполнения.

Вы можете создать представление, как это:

create or replace view orders_2 
as 
select order_no, 
     dense_rank() over (order by source_loc) as fullfill_id, 
     source_loc, 
     item 
from orders 
+0

Предоставляемые данные имеют этот столбец как null. Так что это необходимо заполнить вручную. –

+0

@ImranHemani. Я пытаюсь сказать, что вам вообще не нужно _store_. –

+0

Да, я согласен с тобой .. но это то, что требует клиент. –

0

Я не знаю, если это имеет значение, но если новые записи приходят с одной и той же source_loc поле, и вы хотите, чтобы гарантировать, что они сохранить и унаследовать ранее Назначенное значение для fulfill_id то что-то подобное может работать, чтобы убедиться, что предыдущие идентификаторы наследуются и новые идентификаторы присваиваются:

update mytable t1 
set t1.fulfill_id = (
    with already as (
    select distinct source_loc, fulfill_id 
    from mytable 
    where fulfill_id is not null 
), 
    final_id as (
    select distinct 
     m.source_loc, 
     coalesce (a.fulfill_id, dense_rank() over (order by m.source_loc)) as fulfill_id  
    from 
     mytable m, 
     already a 
    where 
     m.source_loc = a.source_loc (+) 
) 
    select 
    f.fulfill_id 
    from final_id f 
    where 
    f.source_loc = t1.source_loc 
) 
where t1.fulfill_id is null; 

Таким образом, как только fulfill_id назначается source_loc, она сохраняется. Данные, которые начали так:

ORDER_NO FULFILL_ID SOURCE_LOC ITEM 
    100   1   11001  0021 
    100   1   11001  0031 
    100   2   12001  0014 
    100   3   13001  0053 
    100      12001  0014 
    100      10001  0014 

конец бы вот так:

ORDER_NO FULFILL_ID SOURCE_LOC ITEM 
    100   1   11001  0021 
    100   1   11001  0031 
    100   2   12001  0014 
    100   3   13001  0053 
    100   2   12001  0014 
    100   4   10001  0014 
Смежные вопросы