恳请高手帮忙解决oracle8i中几个问题

hhpyt 2010-10-25 11:08:59
首先,我用是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吗?
感谢各位高手不吝赐教!!!
...全文
98 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
心中的彩虹 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hh371011618 的回复:]
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.sp……
[/Quote]
--不使用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 ('西门子电冰箱','西门子洗衣机'......)
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hh371011618 的回复:]
继续期待
[/Quote]
--你看下执行这条语句会报错不?
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 ('西门子电冰箱','西门子洗衣机'......)
hhpyt 2010-10-27
  • 打赏
  • 举报
回复
继续期待
  • 打赏
  • 举报
回复
那就有点蹊跷了
你有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 - Production

SQL> select substr(ename,1,3) from emp;

SUBSTR
------
SMI
ALL
WAR
JON
MAR
BLA
hhpyt 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhuomingwang 的回复:]
SQL code
--你看下执行这条语句会报错不?
select p.spmc 商品名称,
p.spgg 商品规格,
p.xsdj 销售单价,
c.jhcj 进货厂家,
p.fhrq,--用这个试试会报错不?
p.xssl 销售数量,
p.xssl*p.xsdj 销售金额
from view_spxs p,……
[/Quote]
使用p.fhrq 发货日期,可以执行,用substr(p.fhrq,1,6) 发货日期 则提示无效的列名
gelyon 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hh371011618 的回复:]
引用 8 楼 gelyon 的回复:

那就不应该有错了。。。。

会不会跟oracle8i有关呢,恳请不吝赐教,谢谢
[/Quote]
应该不是8i不支持substr,我没有8i环境,你看3#在8i下都能用substr函数,应该不是这个原因。当初我还以为是date字段。。。
心中的彩虹 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 hh371011618 的回复:]
首先,我用是oracle8i的,现有如下几个问题:
1、可以用with as 吗,如果不支持,有什么可以替代的?
2、select .... substr() from .... where ....;去掉substr()可以执行
加上则不能执行,是不是oracle8i不支持还是语法有错,若不支持该如何对某一列取前六位数值(字符类型数据)
3、如有T1.sphm=T2.sphm 和 T……
[/Quote]
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
hhpyt 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gelyon 的回复:]

那就不应该有错了。。。。
[/Quote]
会不会跟oracle8i有关呢,恳请不吝赐教,谢谢
gelyon 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hh371011618 的回复:]
是varchar2类型
[/Quote]
那就不应该有错了。。。。
  • 打赏
  • 举报
回复
一、
--这个是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
0

DECODE(COMM,NULL,0,COMM)
------------------------
0
0
0

已选择14行。
hhpyt 2010-10-26
  • 打赏
  • 举报
回复
是varchar2类型
gelyon 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hh371011618 的回复:]
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.sp……
[/Quote]

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

hhpyt 2010-10-26
  • 打赏
  • 举报
回复
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) 发货日期”,则可以执行,恳请高手赐教
dawugui 2010-10-26
  • 打赏
  • 举报
回复
首先,我用是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.spdm

4、decode()支持吗,若不支持,可以用case when吗?

case when 肯定支持,decode也支持.
gelyon 2010-10-25
  • 打赏
  • 举报
回复
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支持!

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧