#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;