2011-08-19 19 views
27

Fondamentalmente voglio eseguire la seguente query:Oracle SQL: Usa sequenza inserto con 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; 

Non funziona perché "numero di sequenza non è consentita qui" errore SQL. Come posso scrivere questo in modo che Oracle mi consenta di fare ciò che voglio fare?

risposta

51

Supponendo che si desidera raggruppare i dati prima di generare la chiave con la sequenza, suona come si desidera qualcosa di simile

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

Cosa succede se la colonna della sequenza deve apparire nel mezzo della tabella. – atom

+0

Sembra che la regola sia che non ci può essere "dove" nella selezione più esterna. – Dariusz

4

ho provato e lo script eseguito ok!

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; 

puoi leggere questo articolo per saperne di più! http://www.orafaq.com/wiki/ORA-02287

+2

Funziona. Tuttavia hai un piccolo errore. Dove legge 'WITH DATA IS' dovrebbe essere 'WITH DATA AS'. – Fred