查询在 Oracle 11g 上有效,但在 Oracle 8i 上失败

Posted

技术标签:

【中文标题】查询在 Oracle 11g 上有效,但在 Oracle 8i 上失败【英文标题】:Query works on Oracle 11g but fails on Oracle 8i 【发布时间】:2014-02-14 07:29:24 【问题描述】:

我在 Oracle 11g 中运行这个查询没有问题:

select (case
         when seqnum = 1 then
          '1'
         when seqnum = cnt then
          '0'
       end) as value1,
       (case
         when seqnum = 1 then
          t.BEGIN_DT
         when seqnum = cnt then
          t.END_DT
       end) as TIME1,      
       t4.UNIT1 || '.SUBBATCH_TRIGGER' TAG     
  from (select t.*,
               row_number() over(partition by t.BATCH_ID, t.plant_unit, t3.ID2 order by t.BEGIN_DT) as seqnum,
               count(*) over(partition by t.BATCH_ID, t.plant_unit, t3.ID2) as cnt
          from SCH2.tb_pg_unit_stap t
join (select ID1,batch_id from SCH2.VW_BATCH) t2 on t.BATCH_ID = t2.BATCH_ID
join (select ID2,ID1 from SCH1.STEP) t3 on t3.ID1 = t2.ID1) t
join SCH2.TB_W_MACHINE t4 on t4.plant_unit = t.plant_unit
where (seqnum = 1
    or seqnum = cnt) AND (t.BEGIN_DT > '01-jan-2013' AND t.BEGIN_DT < '01-feb-2013');

但是当我在 Oracle 8i (8.7.1) 中运行它时,它会给出 ORA-00933: SQL command not properly end.

在 Oracle 8i 中运行 sql 命令有什么特别需要注意的吗?

提前致谢

【问题讨论】:

8i 版本的 Oracle 不支持 ANSI 连接语法(在 9iR2 中引入)。您将使用逗号 (,) 连接表示法(交叉连接)重写查询,并将连接条件放在查询的 where 子句中。 oracle 8i:扩展支持结束 2006 年 12 月 31 日(……颤抖……) 我知道这是一个非常旧的版本,但我只是在开发一些 .NET 的东西,我需要在那里运行这个查询......这是客户端的数据库 Alternatives to CASE in Oracle 8i 的可能重复项 【参考方案1】:

AFAK case 命令从 9i 开始引入。

【讨论】:

感谢 cmets!有人可以帮我将它重写为 Oracle 8i 吗?我很困惑。 我很确定问题出在 row_number() 和 count(*) 上,如果不使用分析函数重写此查询似乎很棘手。 @simon:不,不是。它们在 8i 中可用 - 这是 ANSI JOIN 在 8.x 中不受支持 哦,你是对的!我从来没有使用过小于 10 克的东西 我的问题已成功回答。我将为 CASE 的替代方案提出另一个问题。谢谢大家!【参考方案2】:

好的 - 行程--内存通道时间:

select decode(seqnum,
                1,    '1',
                cnt,  '0') as value1,
       decode(seqnum,
                1,    t.BEGIN_DT,
                cnt,  t.END_DT) as TIME1,      
       t4.UNIT1 || '.SUBBATCH_TRIGGER' TAG     
  from (select t.*,
               row_number() over (partition by t.BATCH_ID, t.plant_unit, t3.ID2
                                  order by t.BEGIN_DT) as seqnum,
               count(*) over (partition by t.BATCH_ID, t.plant_unit, t3.ID2) as cnt
          from SCH2.tb_pg_unit_stap t
          INNER join (select ID1, batch_id
                        from SCH2.VW_BATCH) t2
            on t.BATCH_ID = t2.BATCH_ID
          INNER join (select ID2, ID1
                        from SCH1.STEP) t3
            on t3.ID1 = t2.ID1) t
  INNER join SCH2.TB_W_MACHINE t4
    on t4.plant_unit = t.plant_unit
  where (seqnum = 1 or seqnum = cnt) AND
        (t.BEGIN_DT > '01-jan-2013' AND t.BEGIN_DT < '01-feb-2013');

【讨论】:

以上是关于查询在 Oracle 11g 上有效,但在 Oracle 8i 上失败的主要内容,如果未能解决你的问题,请参考以下文章

oracle 11g ORA-12514问题

ORA-00942: 表或视图不存在(在单独的 sql 中有效,但在 oracle 函数中无效)

安装oracle 11g出现“ORA-00911:无效字符”怎么办?

ORACLE 11G 禁用 SQL TUNING ADVISOR

在 Oracle 11g 中,JPA 生成的 SQL 使用“fetch first ? rows only”失败并出现 ORA-00933

oracle11g rman验证备份有效性