这个SQL(sybase)在ORACLE下怎么写?
原来在SYBASE下有这样的SQL。
select
a.id,
b.id, b.cd, b.up,
c.b_cd,
d.grp_cd, d.rate_cd, d.age
from
A a, B b, C c, D d
where
a.name = 'testName '
and (a.sale_fromdt <= '20070501 ' and a.sale_todt > = '20070501 ')
and substring(b.cd,1,2) =* a.b_cd
and b.ntype = 'D '
and b.up = '00 '
and c.b_cd =* a.b_cd
and d.grp_cd + d.rate_cd =* c.grp_cd + c.rate_cd
当转到ORACLE后,我对这条SQL进行了修改如下:
select
a.id,
b.id, b.cd, b.up,
c.b_cd,
d.grp_cd, d.rate_cd, d.age
from
A a, B b, C c, D d
where
a.name = 'testName '
and (a.sale_fromdt <= '20070501 ' and a.sale_todt > = '20070501 ')
and substr(b.cd(+),1,2) = a.b_cd
and b.ntype(+) = 'D '
and b.up(+) = '00 '
and c.b_cd(+) = a.b_cd
and d.grp_cd(+) || d.rate_cd(+) = c.grp_cd(+) || c.rate_cd(+)
执行报错。请问,该如何修改。
请大家帮帮忙,我的SQL水平不是太好。
------解决方案--------------------试试外连接:
select
a.id,
b.id, b.cd, b.up,
c.b_cd,
d.grp_cd, d.rate_cd, d.age
from
A a
left join
B b
on
a.b_cd = substr(b.cd,1,2) and b.ntype = 'D ' and b.up = '00 '
left join
C c
on
a.b_cd = c.b_cd
left join
D d
on
d.grp_cd||d.rate_cd=c.grp_cd||c.rate_cd
where
a.name = 'testName '
and
(a.sale_fromdt <= '20070501 ' and a.sale_todt > = '20070501 ')
------解决方案--------------------我有一点不理解楼主,你的sql稍微改一点不就得了。
select
a.id,
b.id, b.cd, b.up,
c.b_cd,
d.grp_cd, d.rate_cd, d.age
from
A a, B b, C c, D d
where
a.name = 'testName '
and (a.sale_fromdt <= '20070501 ' and a.sale_todt > = '20070501 ')
and substr(b.cd(+),1,2) = a.b_cd
and b.ntype(+) = 'D '
and b.up(+) = '00 '
and c.b_cd(+) = a.b_cd
and d.grp_cd(+) || d.rate_cd(+) = c.grp_cd || c.rate_cd
只是把c.grp_cd(+) || c.rate_cd(+)后面的(+