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

时间:2015-12-31 11:43:46

标签: 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);

4 个答案:

答案 0 :(得分:12)

您可以在FAQ

中了解原因
  

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

     

对于SELECT语句:

     
      
  • 在WHERE子句中
  •   
  • 在GROUP BY或ORDER BY子句中
  •   
  • 在DISTINCT条款中
  •   
  • 连同UNION或INTERSECT或MINUS
  •   
  • 在子查询中
  •   

答案 1 :(得分:9)

此查询引发异常:

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

答案 2 :(得分:0)

很惊讶我在这里没有看到实际的解决方案。使用 CTE 是一种解决方法。这样的事情应该可以工作:

async

答案 3 :(得分:-1)

这样做 您可以使用这样的序列,对于部分分组,我建议您遵循@Tony的其他答案     INSERT INTO placement_cal(     cal_id.nextval,EXTRACT(从起始日期开始的年),count(placement_id)     从刊登位置     按年份分组);

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