表tab1中有如下两条记录,
字段A 字段B
记录1:0121(大类) 60.00
记录2:0121001(小类) 70.00 表tab2中,有一字段c,有可能是4位,有可能是6位,与tab1中的A字段是相等的,现在的要求是先要满足6位的,如果6位的记录没有,就找4位的。也就是说,如果 where tab2.c=tab1.A 没有找到匹配的记录,就用where substr(tab2.c,0,4)=tab1.A 也就是先找小类,如果小类不满足,就继续找大类,要求这个条件写在一个SQL语句里。
也就是像这样的:
where (tab2.c=tab1.A or substr(tab2.c,1,4)=tab1.A
但是,上面这样会把两条记录都查出来,我要的结果是如果tab2.c=tab1.A满足的话,就取出70.00,不再执行substr(tab2.c,1,4)=tab1.A了。 谢谢
字段A 字段B
记录1:0121(大类) 60.00
记录2:0121001(小类) 70.00 表tab2中,有一字段c,有可能是4位,有可能是6位,与tab1中的A字段是相等的,现在的要求是先要满足6位的,如果6位的记录没有,就找4位的。也就是说,如果 where tab2.c=tab1.A 没有找到匹配的记录,就用where substr(tab2.c,0,4)=tab1.A 也就是先找小类,如果小类不满足,就继续找大类,要求这个条件写在一个SQL语句里。
也就是像这样的:
where (tab2.c=tab1.A or substr(tab2.c,1,4)=tab1.A
但是,上面这样会把两条记录都查出来,我要的结果是如果tab2.c=tab1.A满足的话,就取出70.00,不再执行substr(tab2.c,1,4)=tab1.A了。 谢谢
解决方案 »
- 各位,请教一个比较精辟的问题,不常见
- 求一条高难度的sql
- tomcat连接池访问oracle数据库服务器会使用哪些端口啊?急啊
- 非常有挑战性的sql语句,高手进~
- oracle9i内存调整后的问题.
- window中的oracle换到linux中也是用imp/exp进行迁移吗?
- 请教VB中利用ADO访问远程服务器上的Oracle数据库,Connectiongstring连接字符串怎么写?全分!
- 装不上ORACLE 8I,怎么办?
- 请教:从sql server2000导出数据到oracle8i,表名是大小写混写的,到oracle也是,所以出了问题。
- 关于执行.sql文件的问题!
- sql ——语句
- 这样的SQL语句怎么写
SQL> SELECT * FROM TABLE1;A B
-------------------- ----------
0121 60.00
012101 70.00
0122 110.00
012301 230.00
012303 45.00
0123 80.006 rows selectedSQL> SELECT * FROM TABLE2;C
--------------------
012101
0122
0123SQL> SELECT A, B
2 FROM (SELECT T1.*,
3 ROW_NUMBER() OVER(PARTITION BY SUBSTR(T1.A, 0, 4) ORDER BY T1.A DESC) RN
4 FROM TABLE1 T1) TT
5 WHERE EXISTS (SELECT 1
6 FROM TABLE2 T2
7 WHERE DECODE(T2.C, TT.A, T2.C, SUBSTR(TT.A, 0, 4)) =
8 DECODE(T2.C, TT.A, T2.C, SUBSTR(T2.C, 0, 4)))
9 AND RN = 1;A B
-------------------- ----------
012101 70.00
0122 110.00
012303 45.00
--改了一下:select a,b from tab1
where length(a)=(select max(length(m.a))
from tab1 m,tab2 n
where 1 = decode(m.a,
n.c,
1,
substr(n.c,1,4),
1,
0
)
)
;