读书人

oracle数据库中多张表进行查询需要注意

发布时间: 2012-12-16 12:02:32 作者: rapoo

oracle数据库中多张表进行查询需要注意什么问题??为什么查不到我想要的值
我在数据库中进行七张表的关联查询,where后的条件有12个,其中很多表都不直接关联,现在查询不到我想要的数据,请问各位高手,当多张表进行关联的时候,应该注意哪些问题呢,where后的查询条件是不是有什么先后顺序???

select
GI.GUARANTYID as GUARANTYID,
GI.GUARANTYTYPE as GUARANTYTYPE,
case
when GI.GUARANTYTYPE like '2010%' then '020'
when GI.GUARANTYTYPE like '2020%' then '030'
when GI.GUARANTYTYPE like '1010%' then '040'
when GI.GUARANTYTYPE like '1020%' then '050'
else '070' end as CLASSIFY,
GI.CONFIRMVALUE as CONFIRMVALUE,
BD.BUSINESSTYPE as BUSINESSTYPE,
BD.SERIALNO as BUSINESSSERIALNO,
BD.BALANCE as BUSINESSBALANCE,
GC.SERIALNO as GUARANTYCONTRACTID,
'2011/09/20' as SESSIONID
from BUSINESS_DUEBILL BD,
BUSINESS_CONTRACT BC,
GUARANTY_CONTRACT GC,
lmt_tree_node LMT,
AGR_CRE_SEC_RELA AGR,
GUARANTY_INFO GI, GUARANTY_RELATIVE GR
where
GI.guarantyId =GR.guarantyId
and GR.GCCONTRACTNO =GC.serialNo
and GC.serialNo=BC.RELATIVESERIALNO
and GC.serialNo= AGR.GUR_SERIALNO
and BC.SERIALNO=BD.RelativeSerialNo2


and BC.SerialNo =AGR.SERIALNO
and AGR.CREDITOBJTYPE = 'BusinessContract'
and BC.relativelmtid=LMT.lmtid
and GC.ContractStatus = '020'
and BD.Balance >0
and (GC.GUARANTYTYPE='050' or GC.GUARANTYTYPE='060')
and BD.InputDate = '2011/09/20'
[最优解释]
这几张表都是内联,说明哪张表之间没有关系到数据。

分拆看一下,定位是哪张表没有关联到数据。
[其他解释]
应该没有顺序要求,
觉得还是你的数据的问题,
建议你把条件一个一个加上去看看。
[其他解释]
where后面是肯定没有顺序的.你这些where我也不知道是不是有空值,我随便猜一下,十二个判断里面只要有一个空值,那你就什么都得不到.这是oracle的特性.所以这种关联最好是使用外联,在等号后面要加上加号的.

你把那些判断拆开,先试一个等号,再试两个等号,以此类推..

外关联的判断是如下形式: where GI.guarantyId =GR.guarantyId(+)

[其他解释]
结果没数据,是表中没数据,要不就是关联条件有错误。
7个表,12个条件不算多,至于先后顺序,与性能弱弱的有点关系,可以忽略
[其他解释]
对了!!!我忽然感觉你这条命令很有问题!!!我怀疑你这条命令从根本上就是个错误的命令!!!!

我在多张表进行关联的时候,从不敢像你这么写命令!!

如果我要多张表关联,首先是取出两张表的关联,然后把这张新表,作为C表,再去关联D表,然后这张表作为E表,再去关联F表,虽然麻烦点,但是可以保证关联不会出问题!!

而你这条命令的关联,我从感觉上好象觉得是错误的呀!~~~~~~~~~~~~~
[其他解释]
我最多的一次关联,是科目英语,一共关联了80多次!!我所使用的方式,从头到尾就是嵌套!!!把命令层层的嵌进去,每次关联都做为新表!!
[其他解释]
这样的关联查询会影响速度的,当你的数据多的时候会很慢!建议你可以说先用with aa as(select 。。。)查出满足部分条件的数据,然后在这个基础上在查询,这样看的也明了
[其他解释]

with aa as(select 。。。)个方法没有使用过,能稍微详细点吗?举个简单的例子也可以。

引用:
这样的关联查询会影响速度的,当你的数据多的时候会很慢!建议你可以说先用with aa as(select 。。。)查出满足部分条件的数据,然后在这个基础上在查询,这样看的也明了

读书人网 >oracle

热点推荐