#sql #postgresql #sql-insert
#sql #postgresql #sql-вставка
Вопрос:
Я вставил dataset в таблицу с уникальным индексом. Мне нужно получить идентификаторы вставленных значений.
INSERT INTO table_subject_topics_exams (name_of_subject, section, topic, subtopic)
VALUES
('Algebra', 'Mathematics', 'Progressions', 'Number Sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
('Algebra', 'Mathematics', 'Progressions', 'Geometric Progression'),
('Algebra', 'Mathematics', 'Progressions', 'Geometric Progression'),
ON CONFLICT DO NOTHING returning ids_of_subject_section;
база данных, которую я получаю:
3 "Algebra" "Mathematics" "Progressions" "Number sequences"
33 "Algebra" "Mathematics" "Progressions" "Arithmetic progression"
37 "Algebra" "Mathematics" "Progressions" "Geometric progression"
первый столбец — это номера идентификаторов. Моя цель — получить
3 (12 times)
33 (4 times)
37 (2 times)
Как я должен выполнить свой запрос?
Ответ №1:
Используйте returning
предложение:
with i as (
insert into table_subject_topics_exams . . .
. . .
returning * -- or whatever columns you want
)
select *
from i;
Вот скрипка db<> .
Редактировать:
Если вам нужны все исходные значения, вам нужно будет поместить их в «таблицу» и соединить их обратно:
with vals as (
select *
from (values ('Algebra', 'Mathematics', 'Progressions', 'Number Sequences'),
('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
. . .
) v(name_of_subject, section, topic, subtopic)
),
i as (
insert into table_subject_topics_exams (name_of_subject, section, topic, subtopic)
select name_of_subject, section, topic, subtopic
from vals
on conflict do nothing
returning ids_of_subject_section
)
select v.*, i.ids_of_subject_section
from vals join
i
using (name_of_subject, section, topic, subtopic);
Комментарии:
1. CTE на самом деле не нужен
2. Я указываю странный в скобках. Но это вообще не работает
3. @a_horse_with_no_name . , , Это правда, но я предпочитаю отделять действие DML от возвращаемых результатов.
4. @ВладимирКузовкин . . . Я добавил db<>скрипку с возвращаемым предложением.
5. вы возвращаете 4 строки в таблице. Но в результате я хочу иметь идентификаторы существующих значений в таблице
Ответ №2:
Этот запрос выполняет ВСТАВКУ и ВЫБОР на входе для создания агрегации:
WITH i AS (
SELECT
*
FROM
(VALUES
( 'Algebra', 'Mathematics', 'Progressions', 'Number Sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Geometric Progression' ),
( 'Algebra', 'Mathematics', 'Progressions', 'Geometric Progression' )
) sub ( name_of_subject, section, topic, subtopic )
),
dml AS (
INSERT INTO table_subject_topics_exams ( name_of_subject, section, topic, subtopic )
SELECT *
FROM i
ON CONFLICT
DO NOTHING
RETURNING *
)
SELECT ids_of_subject_section
, COUNT ( * )
FROM
i
LEFT JOIN dml USING ( name_of_subject, section, topic, subtopic )
GROUP BY
ids_of_subject_section;