2011-08-19 65 views
27

基本上我想运行下面的查询:的Oracle SQL:在插入使用顺序与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; 

它不起作用,因为“这里不允许序列号” SQL错误。我怎么写这个,所以Oracle会让我做我想做的事情?

回答

51

假设你要组数据你生成的序列键之前,它听起来就像你想要的东西,像

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

如果序列列需要出现在表的中间怎么办? – atom

+0

看来,规则是最外层的选择中不可能有“where”。 – Dariusz

4

我测试和脚本运行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; 

你可以阅读这篇文章了解更多! http://www.orafaq.com/wiki/ORA-02287

+2

它的工作原理。但是你有一个小错误。它的内容是'WITH DATA IS',它应该是'WITH DATA AS'。 – Fred