ORA-02287: порядковый номер не разрешен здесь
Я пытаюсь выбрать значения из двух таблиц и вставить их в одну таблицу и вычислить количество мест размещения в год. Я продолжаю получать сообщение о том, что последовательность здесь не разрешена.
DROP table placement_cal CASCADE CONSTRAINTS;
CREATE TABLE placement_cal(
cal_id INTEGER NOT NULL,
year INTEGER,
no_of_placements INTEGER,
CONSTRAINT pk_cal_dim PRIMARY KEY (cal_id)
);
INSERT INTO placement_cal (
SELECT cal_id.nextval , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement
group by year);
INSERT INTO placement_cal (
SELECT cal_id.nextval , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement_two
group by year);
Ответы
Ответ 1
Вы можете получить причину в FAQ
Ниже перечислены случаи, когда вы не можете использовать последовательность:
Для оператора SELECT:
- В предложении WHERE
- В предложении GROUP BY или ORDER BY
- В предложении DISTINCT
- Наряду с UNION или INTERSECT или MINUS
- В подзапросе
Ответ 2
Этот запрос вызывает исключение:
SELECT cal_id.nextval , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement
group by year;
Это потому, что вы не можете выбрать значение последовательности в запросе с предложением group by
.
Кроме того, предложение group by
должно включать все неагрегированные выражения из предложения select
, чего нет у вас. Я предполагаю, что year
является псевдонимом EXTRACT(YEAR FROM start_date)
, и в этом случае это запрос, который вам нужен:
INSERT INTO placement_cal
SELECT cal_id.nextval, year, cnt FROM
( SELECT EXTRACT(YEAR FROM start_date) year, count(placement_id) cnt
FROM placement
group by EXTRACT(YEAR FROM start_date)
);
Ответ 3
Сделайте это следующим образом. Вы можете использовать последовательность, подобную этой, для группы по частям я рекомендую вам следовать другому ответу из @Tony INSERT INTO place_cal (cal_id.nextval, EXTRACT (YEAR FROM start_date), count (place_id) FROM группы размещения по год);
INSERT INTO placement_cal (
cal_id.nextval , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement_two
group by year);