2015-09-28 2 views
1

У меня есть данные в следующем формате:Oracle SQL Update по ROWNUM

ORD_NO ITEM FULFILL_ID 
SA1  1000  1 
SA1  2000  2 
SA2  2000  1 
SA2  3000  2 
SA2  9000  3 

Я хочу, чтобы заполнить значения для FULFILL_ID столбца, который должен начинаться с 1 и увеличиваться до количества строк для одного конкретный ORD NO, как я уже заполнил выше.

Как это сделать?

ответ

2

Это то, что делает ROW_NUMBER():

select ord_no, item, 
     row_number() over (partition by ord_no order by item) as fulfill_id 
from table t; 

Это возвращает значение в качестве запроса. Для обновления требуется несколько другой запрос.

EDIT:

Обновление может быть выполнено следующим образом:

update table t 
    set fulfill_id = (select count(*) 
         from table t2 
         where t2.ord_no = t.order_no and 
          t2.item <= t.item 
        ); 

Эта версия предполагает, что item различна для одних и тех же значениях ord_no.

+0

Деталь может быть одинаковым для заказов. Мне нужно обновить каждую строку как разное число. –

+1

Я считаю, что производительность Oracle отстойна при обновлении из коррелированных подзапросов таким образом. – MatBailie

2

вы можете использовать слияния заявление для этого

merge into table1 t3 using 
(
select ord_no, item, 
     row_number() over (partition by ord_no order by item) as fulfill_id 
from table1 
) s 
on 
(t3.ORD_NO=s.ORD_NO and t3.ITEM=s.ITEM) 
when matched then 
update set t3.FULFILL_ID=s.fulfill_id 
+0

Элемент не может быть уникальным для любого конкретного заказа. Номер заказа . Как обобщать update_id в зависимости от количества строк ниже OrderNo? –

+0

@imran hemani может у вас отправить этот сценарий? – Buddi

+0

, если 100 строк есть с одним ord_no, он будет давать числа от 1 до 100 и обновляет значение__события. мы разбиваем на столбец ord_no. – Buddi