我正在尝试为主帐户收集多个相关的数据并创建一个视图(例如,逾期余额,帐户余额,债务恢复状态,利息保留)。这种方法会有效吗?数据库平台是Informix,Oracle和Sql Server。在Informix上做一些统计我只是对auubmast进行了1次连续扫描。我认为子选择非常有效,因为它们会立即过滤到帐号。在我完成之前,我可能需要很多次选择。除了效率问题,还有其他“整洁”方法吗?
谢谢。
选择 auubmast.acc_num, auubmast.cls_cde, auubmast.acc_typ,
(select
sum(auubtrnh.trn_bal)
from auubtrnh, aualtrcd
where aualtrcd.trn_cde = auubtrnh.trn_cde
and auubtrnh.acc_num = auubmast.acc_num
and (auubtrnh.due_dte < current or aualtrcd.trn_typ = 'I')
) as ovd_bal,
(select
sum(auubytdb.ytd_bal)
from auubytdb, auubsvgr
where auubytdb.acc_num = auubmast.acc_num
and auubsvgr.svc_grp = auubmast.svc_grp
and auubytdb.bil_yer = auubsvgr.bil_yer
) as acc_bal,
(select
max(cur_stu)
from audemast
where mdu_acc = auubmast.acc_num
and mdu_ref = 'UB'
) as drc_stu,
(select
hol_typ
from aualhold
where mdu_acc = auubmast.acc_num
and mdu_ref = 'UB'
and pro_num = 2601
and (hol_til is null or hol_til > current)
) as int_hld
答案 0 :(得分:0)
通常,对此的答案是应尽可能避免相关子查询。
使用它们将导致您的视图进行全表扫描,这很糟糕。您想要使用这样的子查询的唯一情况是,如果您可以将主选择的范围限制为仅几行,或者确实没有其他选择。
当您遇到这种情况时,您可能需要考虑在更新触发器上添加列并预先计算它们,而不是使用子查询。这将使您的数据库保存一个颠簸。