Oracle ORA-02287:此处不允许使用序列号

Oracle ORA-02287:此处不允许使用序列号,oracle,Oracle,我试图从两个表中选择值,并将它们插入一个表中,然后计算每年的总就业人数。我一直收到一个错误,说这里不允许序列 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

我试图从两个表中选择值,并将它们插入一个表中,然后计算每年的总就业人数。我一直收到一个错误,说这里不允许序列

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

你可以找到原因

以下是无法使用序列的情况:

对于SELECT语句:

在WHERE子句中 在GROUPBY或ORDERBY子句中 分句 与并集、交集或负数一起 在子查询中
此查询引发异常:

SELECT cal_id.nextval  , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement
group by year;
这是因为不能在带有GROUPBY子句的查询中选择序列值

此外,GROUPBY子句必须包含select子句中的所有非聚合表达式,而您的select子句中没有。我猜那一年是EXTRACTYEAR 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)
);
像这样做 你可以使用这样的顺序,对于分组,我建议你遵循@Tony的另一个答案 插入到placement_cal中 cal_id.nextval,从开始日期算起的年份,countplacement_id 从安置 逐年分组

INSERT INTO placement_cal (
cal_id.nextval  , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement_two
group by year);

奇怪的是,我没有看到一个真正的解决方案。使用CTE是一种变通方法。像这样的方法应该会奏效:

INSERT INTO placement_cal (
    WITH tempPlacement AS (
        SELECT EXTRACT(YEAR FROM start_date) year, count(placement_id) cnt
        FROM placement
        group by EXTRACT(YEAR FROM start_date)
    ) SELECT cal_id.nextval, year, cnt FROM tempPlacement
);

不相关,但是:select周围的括号对于insert完全没有用处。。。选择语句。甚至语法也是无效的。在子查询点中需要注意的一点是:我还遇到了ORA-02287使用定义为表函数的带有关系的子查询。这会产生错误:select*from tablesys.ku$\u objnumset1,2 t其中3不在select列中\u值from t,而此查询修复了该错误:将t作为select*from tablesys.ku$\u objnumset1,2 t select*from t其中3不在select列中\u值from t。有趣的是,并没有出现任何明显的序列,可能是表函数的某些内部。