номер строки при вставке в

#sql #oracle #sql-insert #oracle12c #row-number

#sql #Oracle #sql-вставка #oracle12c #номер строки

Вопрос:

Я хотел вставить номер строки в один из столбцов. Но поскольку row_number() это функция window (аналитическая, присущая Oracle), которая может использоваться только для оператора select, есть ли какой-либо другой способ вставить номер строки.

например :

 INSERT INTO prnr (pm,GEG_ID,ET_ID,fzg_id,nr,id)
VALUES(p_gpm_id,master_rec.geg_id,master_rec.et_id,
       master_rec.fzg_id,row_number() over (partition by master_rec.geg_id));
 

я хочу использовать этот оператор insert в procudure.

Комментарии:

1. Что такое master_rec ? Этот код имеет проблемы, выходящие за рамки row_number() . Примеры данных и желаемых результатов были бы полезны.

2. ROW_NUMBER используется для присвоения дополнительных номеров набору записей на основе ORDER BY предложения в OVER предложении. Чего вы ожидаете row_number() over (partition by master_rec.geg_id) и снова задаете тот же вопрос, что и Гордон, что такое master_rec ?

Ответ №1:

Попробуйте рефакторинг вашего кода в INSERT INTO ... SELECT :

 INSERT INTO prnr (pm, GEG_ID, ET_ID, fzg_id, nr, id)
SELECT p_gpm_id, geg_id, et_id, fzg_id, ROW_NUMBER() OVER (PARTITION BY geg_id),
       -- some 6th column here...
FROM master_rec;
 

Комментарии:

1. master_Rec — это не таблица, а переменная, выбранная из какой-либо другой таблицы. оператор select в этом случае невозможен. итак, есть ли какая-либо альтернатива для row_number() в этом случае простой вставки в

2. Пожалуйста, обратитесь к комментарию Гордона под вашим вопросом, который я решительно поддерживаю.

Ответ №2:

Если ваша цель — просто сгенерировать последовательное целочисленное значение (как описано в комментарии) для id столбца, затем воссоздайте существующий id столбец с GENERATED ALWAYS AS IDENTITY помощью такой опции, как

 ALTER TABLE prnr DROP COLUMN id;
ALTER TABLE prnr ADD id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY;