В будущем, пожалуйста, включите небольшой пример (например, тот, который я построил ниже), который люди могут использовать, чтобы помочь вам. Это поможет прояснить ваш вопрос и гарантирует, что время, которое люди добровольно участвуют в SO, потрачено не зря.
Я думаю, вы можете делать все, что хотите, с помощью MERGE. Я использую elastic_rank () для расчета заказа на основе идентификатора таблицы и существующего заказа и перенумерации каждого продукта. Затем MERGE обновит только те строки, которые необходимо изменить.
CREATE TABLE products (
table_id NUMBER,
product_id NUMBER,
order_id NUMBER);
ALTER TABLE products
ADD CONSTRAINT products_pk
PRIMARY KEY (product_id)
USING INDEX;
BEGIN
INSERT INTO products VALUES (1, 1, 1);
INSERT INTO products VALUES (1, 2, 2);
INSERT INTO products VALUES (1, 3, 3);
INSERT INTO products VALUES (1, 4, 4);
INSERT INTO products VALUES (1, 5, 5);
INSERT INTO products VALUES (2, 6, 6);
INSERT INTO products VALUES (2, 7, 7);
INSERT INTO products VALUES (2, 8, 8);
INSERT INTO products VALUES (2, 9, 9);
INSERT INTO products VALUES (2, 10, 10);
COMMIT;
END;
/
SELECT *
FROM products
ORDER BY table_id,
order_id;
/*
T P O
1 1 1
1 2 2
1 3 3
1 4 4
1 5 5
2 6 6
2 7 7
2 8 8
2 9 9
2 10 10
*/
UPDATE products
SET table_id = 1
WHERE product_id = 8;
SELECT *
FROM products
ORDER BY table_id,
order_id;
/*
T P O
1 1 1
1 2 2
1 3 3
1 4 4
1 5 5 <--
1 8 8 <--
2 6 6
2 7 7 <--
2 9 9 <--
2 10 10
*/
MERGE INTO products p
USING (SELECT product_id,
dense_rank() over(ORDER BY table_id, order_id) AS order_id
FROM products) x
ON (p.product_id = x.product_id)
WHEN MATCHED THEN
UPDATE
SET p.order_id = x.order_id
WHERE p.order_id != x.order_id;
-- 4 rows updated
SELECT *
FROM products
ORDER BY table_id,
order_id;
/*
T P O
1 1 1
1 2 2
1 3 3
1 4 4
1 5 5
1 8 6
2 6 7
2 7 8
2 9 9
2 10 10
*/