【问题标题】:Oracle SQL: Use sequence in insert with Select StatementOracle SQL:在插入中使用序列与 Select 语句
【发布时间】:2011-10-30 20:31:21
【问题描述】:

基本上我想运行以下查询:

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 让我做我想做的事?

【问题讨论】:

    标签: sql oracle plsql insert sequence


    【解决方案1】:

    假设您想在使用序列生成密钥之前对数据进行分组,听起来您想要类似的东西

    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)
    

    【讨论】:

    • 如果序列列需要出现在表格中间怎么办。
    • 看来规则是最外层的select不能有“where”。
    • @SomnathMusib 你是个天才。 TCS 对.. 你会的。
    • @JayKumarR 感谢您的讽刺。我曾经遇到过这个问题。在将数据写入平面文件(用于大型机系统)时,我必须从表中获取数据并在记录中间添加行号(序列)。
    【解决方案2】:

    我测试过,脚本运行正常!

    INSERT INTO HISTORICAL_CAR_STATS (HISTORICAL_CAR_STATS_ID, YEAR,MONTH,MAKE,MODEL,REGION,AVG_MSRP,COUNT) 
    WITH DATA AS
    (
        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

    【讨论】:

    • 它有效。但是你有一个小错误。上面写着“WITH DATA IS”的地方应该是“WITH DATA AS”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多