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

sy5wg1nm  于 2023-03-22  发布在  Oracle
关注(0)|答案(5)|浏览(450)

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

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

qacovj5a1#

您可以在FAQ中获取原因
以下是不能使用序列的情况:
对于SELECT语句:

  • 在WHERE子句中
  • 在GROUP BY或ORDER BY子句中
  • 在DISTINCT子句中
  • 与UNION或INTERSECT或MINUS沿着
  • 在子查询中
ep6jt1vc

ep6jt1vc2#

此查询引发异常:

SELECT cal_id.nextval  , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement
group by year;

这是因为不能在带有group by子句的查询中选择序列值。
另外,group by子句必须包含来自select子句的所有非聚合表达式,而你的子句没有。我猜yearEXTRACT(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)
);
sqougxex

sqougxex3#

很惊讶我在这里没有看到实际的解决方案。使用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
);
0mkxixxg

0mkxixxg4#

当您在一个表中插入数据并从另一个表中获取数据时,请不要使用order by子句,以避免序列号不允许错误。

628mspwn

628mspwn5#

这样做你可以使用这样的序列,对于分组部分,我建议你遵循@Tony INSERT INTO placement_cal(cal_id.nextval,EXTRACT(YEAR FROM start_date),count(placement_id)FROM placement group by year)的其他答案;

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

相关问题