-1

我正在尝试为一个主账户收集多个相关的数据并创建一个视图(例如逾期余额、账户余额、债务回收状态、利息持有)。这种方法会有效吗?数据库平台是 Informix、Oracle 和 Sql Server。在 Informix 上做一些统计,我只得到 1 次 auubmast 的顺序扫描。我认为子选择非常有效,因为它们会立即过滤到帐号。在我完成之前,我可能需要许多子选择。除了效率问题之外,还有其他“整洁”的方法吗?

谢谢你。

选择 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

从 auubmast

4

1 回答 1

0

一般来说,这个问题的答案是尽可能避免相关子查询。

使用它们将导致对您的视图进行全表扫描,这很糟糕。唯一要使用这样的子查询的情况是,如果您可以将主选择的范围限制为仅几行,或者确实没有其他选择。

当您遇到这样的情况时,您可能需要考虑添加列并在更新触发器上预先计算它们,而不是使用子查询。这将使您的数据库崩溃。

于 2013-05-27T06:18:44.687 回答