2011-08-19 15 views
27

Básicamente Quiero ejecutar la siguiente consulta:Oracle SQL: Uso secuencia en la inserción con la sentencia Select

INSERT INTO historical_car_stats (historical_car_stats_id, year, month, make, model, region, avg_msrp, count) 
    SELECT 
    my_seq.nextval, 
    '2010', 
    '12', 
    'ALL', 
    'ALL', 
    region, 
    sum(avg_msrp * count)/sum(count), 
    sum(count) 
    FROM historical_car_stats 
    WHERE year = '2010' 
     AND month = '12' 
     AND make != 'ALL' 
    GROUP BY region; 

No funciona porque "número de secuencia no permitida aquí" error de SQL. ¿Cómo puedo escribir esto para que Oracle me permita hacer lo que quiero hacer?

Respuesta

51

Suponiendo que desea agrupar los datos antes de generar la clave con la secuencia, parece que usted quiere algo así como

INSERT INTO HISTORICAL_CAR_STATS (
    HISTORICAL_CAR_STATS_ID, 
    YEAR, 
    MONTH, 
    MAKE, 
    MODEL, 
    REGION, 
    AVG_MSRP, 
    CNT) 
SELECT MY_SEQ.nextval, 
     year, 
     month, 
     make, 
     model, 
     region, 
     avg_msrp, 
     cnt 
    FROM (SELECT '2010' year, 
       '12' month, 
       'ALL' make, 
       'ALL' model, 
       REGION, 
       sum(AVG_MSRP*COUNT)/sum(COUNT) avg_msrp, 
       sum(cnt) cnt 
      FROM HISTORICAL_CAR_STATS 
     WHERE YEAR = '2010' 
      AND MONTH = '12' 
      AND MAKE != 'ALL' 
     GROUP BY REGION) 
+0

¿Qué pasa si la columna de secuencia debe aparecer en el medio de la tabla. – atom

+0

Parece que la regla es que no puede haber "dónde" en la selección más externa. – Dariusz

4

Probé y el script se ejecute bien!

INSERT INTO HISTORICAL_CAR_STATS (HISTORICAL_CAR_STATS_ID, YEAR,MONTH,MAKE,MODEL,REGION,AVG_MSRP,COUNT) 
WITH DATA IS 
(
    SELECT '2010' YEAR,'12' MONTH ,'ALL' MAKE,'ALL' MODEL,REGION,sum(AVG_MSRP*COUNT)/sum(COUNT) AVG_MSRP,sum(Count) COUNT 
    FROM HISTORICAL_CAR_STATS 
    WHERE YEAR = '2010' AND MONTH = '12' 
    AND MAKE != 'ALL' GROUP BY REGION 
) 
SELECT MY_SEQ.nextval, YEAR,MONTH,MAKE,MODEL,REGION,AVG_MSRP,COUNT 
FROM DATA; 

¡Puede leer este artículo para entender más! http://www.orafaq.com/wiki/ORA-02287

+2

Funciona. Sin embargo, tiene un pequeño error. Donde dice 'WITH DATA IS' debe ser 'WITH DATA AS'. – Fred

Cuestiones relacionadas