首先,我用是oracle8i的,现有如下几个问题:
1、可以用with as 吗,如果不支持,有什么可以替代的?
2、select .... substr() from .... where ....;去掉substr()可以执行
   加上则不能执行,是不是oracle8i不支持还是语法有错,若不支持该如何对某一列取前六位数值(字符类型数据)
3、如有T1.sphm=T2.sphm 和 T2.spdm=T3.spdm 。则 select T1.*, T3.spmc from T1,T3 Where T1.sphm=T2.sphm and
   T2.spdm=T3.spdm,这句SQL有问题吗?若有问题,正确的写法?
4、decode()支持吗,若不支持,可以用case when吗?
感谢各位高手不吝赐教!!!

解决方案 »

  1.   

    1、with as 是SQL99的标准语法,Oracle9i release 2中才支持的,其作用只是充当临时表的作用,8i中尼可以直接创建一个临时表代替with as ,或者直接创建表一样的。
    2、substr函数8i不支持吗?这个不清楚,应该支持的,或许是你写错了它的用法。substr(col_name,1,6)
    3、肯定你的错了撒,你SQL语句只是从T1,T3两个表查询的,哪里多出了T2表啊,要么直接查询select T1.*, T3.spmc from T1,T3 Where T1.sphm=T3.spdm;
    4、case when 是标准SQL,肯定8i支持!
      

  2.   

    首先,我用是oracle8i的,现有如下几个问题:
    1、可以用with as 吗,如果不支持,有什么可以替代的?如果根据某表创建表,是支持的.2、select .... substr() from .... where ....;去掉substr()可以执行
      加上则不能执行,是不是oracle8i不支持还是语法有错,若不支持该如何对某一列取前六位数值(字符类型数据)这个?substr()肯定支持.3、如有T1.sphm=T2.sphm 和 T2.spdm=T3.spdm 。则 select T1.*, T3.spmc from T1,T3 Where T1.sphm=T2.sphm and
      T2.spdm=T3.spdm,这句SQL有问题吗?若有问题,正确的写法?from中没有t2表,则条件中不能使用.
    更改为如下:
    select T1.*, T3.spmc from T1,T2 , T3 
    Where T1.sphm=T2.sphm and T2.spdm=T3.spdm4、decode()支持吗,若不支持,可以用case when吗?case when 肯定支持,decode也支持.
      

  3.   

    一、
    --这个是8i下的
    SQL> with tab as 
    SP2-0734: 未知的命令开头 "with tab a..." - 忽略了剩余的行。
    --这个是10g下的
    SQL> with tab as
      2  
    所有8i不支持with tab as...,你可以创建表来代替二
    --8i下的
    --注意substr()里的参数,substr(ename,1,4) 从第一个字符开始取4个
    --substr(ename,4) 从第4个字符开始取到最后的
    SQL> select substr(ename,1,4),substr(ename,4) from emp where empno=7369;SUBSTR(E SUBSTR(ENAME,4
    -------- --------------
    SMIT     TH

    select T1.*, T3.spmc from T1,T3 Where T1.sphm=T2.sphm and
    T2.spdm=T3.spdm
    --你用到了T2表但是在from后面没有T2表,应该改为:
    select T1.*, T3.spmc from T1,T2,T3  
    Where T1.sphm=T2.sphm and T2.spdm=T3.spdm四
    --8i下的
      1* select decode(comm,null,0,comm) from emp
    SQL> /DECODE(COMM,NULL,0,COMM)
    ------------------------
                           0
                         300
                         500
                           0
                        1400
                           0
                           0
                           0
                           0
                           0
                           0DECODE(COMM,NULL,0,COMM)
    ------------------------
                           0
                           0
                           0已选择14行。
      

  4.   

    1
    可以用临时表
    2
    可以用substr
    3
    --错的
    --或者这样
    select T1.*, T3.spmc from T1,T2,T3 Where T1.sphm=T3.sphm and T2.spdm=T3.spdm
    4
    可以用case when.... end
      

  5.   

    2.select p.spmc 商品名称,p.spgg 商品规格,p.xsdj 销售单价,c.jhcj 进货厂家,substr(p.fhrq,1,6) 发货日期,p.xssl 销售数量,p.xssl*p.xsdj 销售金额 from view_spxs p,
    view_jhcj c
    where (p.fhrq between '20090101'and'20090131')
    and p.spmc=c.spmc
    and p.spmc in ('西门子电冰箱','西门子洗衣机'......)这句无法执行,提示“无效的列名”,若去掉“substr(p.fhrq,1,6) 发货日期”,则可以执行,恳请高手赐教
      

  6.   


    你p.fhrq字段是date类型还是varchar2类型???如果是date类型substr就不行!直接to_char(p.fhrq,'yyyymm')
      

  7.   

    会不会跟oracle8i有关呢,恳请不吝赐教,谢谢
      

  8.   

    应该不是8i不支持substr,我没有8i环境,你看3#在8i下都能用substr函数,应该不是这个原因。当初我还以为是date字段
      

  9.   

    --你看下执行这条语句会报错不?
    select p.spmc 商品名称,
    p.spgg 商品规格,
    p.xsdj 销售单价,
    c.jhcj 进货厂家,
    p.fhrq,--用这个试试会报错不?
    p.xssl 销售数量,
    p.xssl*p.xsdj 销售金额 
    from view_spxs p,
    view_jhcj c
    where (p.fhrq between '20090101'and'20090131')
    and p.spmc=c.spmc
    and p.spmc in ('西门子电冰箱','西门子洗衣机'......)
      

  10.   

    --不使用substr    这样看p.fhrq 发货日期可以运行不
    select p.spmc 商品名称,p.spgg 商品规格,p.xsdj 销售单价,c.jhcj 进货厂家,p.fhrq 发货日期,p.xssl 销售数量,p.xssl*p.xsdj 销售金额 from view_spxs p,
    view_jhcj c
    where (p.fhrq between '20090101'and'20090131')
    and p.spmc=c.spmc
    and p.spmc in ('西门子电冰箱','西门子洗衣机'......)
    --实在不行就转了
    select p.spmc 商品名称,p.spgg 商品规格,p.xsdj 销售单价,c.jhcj 进货厂家,
    to_char(to_date(trim(p.fhrq),'yyyymmdd'),'yyyymm') 发货日期,p.xssl 销售数量,p.xssl*p.xsdj 销售金额 from view_spxs p,
    view_jhcj c
    where (p.fhrq between '20090101'and'20090131')
    and p.spmc=c.spmc
    and p.spmc in ('西门子电冰箱','西门子洗衣机'......)
      

  11.   

    使用p.fhrq 发货日期,可以执行,用substr(p.fhrq,1,6) 发货日期 则提示无效的列名
      

  12.   

    那就有点蹊跷了 
    你有13楼的方法试下
    to_char(to_date(trim(p.fhrq),'yyyymmdd'),'yyyymm')
    --substr在8i里可以用的啊
    连接到: 
    Oracle8i Release 8.1.7.0.0 - Production
    JServer Release 8.1.7.0.0 - ProductionSQL> select substr(ename,1,3) from emp;SUBSTR
    ------
    SMI
    ALL
    WAR
    JON
    MAR
    BLA