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

fre*_*999 12 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 (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);
Run Code Online (Sandbox Code Playgroud)

Rah*_*thi 14

你可以在FAQ中找到原因

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

对于SELECT语句:

  • 在WHERE子句中
  • 在GROUP BY或ORDER BY子句中
  • 在DISTINCT子句中
  • 与UNION或INTERSECT或MINUS一起使用
  • 在子查询中


Ton*_*ews 10

此查询引发异常:

SELECT cal_id.nextval  , EXTRACT(YEAR FROM start_date) , count(placement_id)
FROM placement
group by year;
Run Code Online (Sandbox Code Playgroud)

这是因为您无法在带有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)
);
Run Code Online (Sandbox Code Playgroud)


Fre*_*ddy 5

很惊讶我在这里没有看到实际的解决方案。使用 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
);
Run Code Online (Sandbox Code Playgroud)