优化查询informix中的默认值

时间:2016-01-28 06:06:18

标签: optimization views informix default-value

要求:创建一个视图,其中记录来自4个表 第一个字段来自scr,secount来自mxr,第三个字段是来自mrt的默认值第四个。

第五个是基于语言的desc,条件如下 在mxr中有一个字段lng需要在data_el_nm和lng(mxr)的帮助下读取rpr如果没有找到记录则在data_el_nm和lng(scr)的帮助下读取rpr如果没有找到读取data_el_nm和默认lng (这是en)..如果没有找到所有三个,则处理UNTILL这个字段带有空格。我通过将外部穿过rpr来实现这一点,但这需要花费很多时间。可以采用任何一种最佳的方式来做到这一点吗?谢谢你

CREATE VIEW "informix".abc(
cmpy_id,
lgn_id,
fld_nm,
data_el_nm,
desc
)

AS

SELECT

s.cmpy_id,
u.lgn_id,
"RTONM",
r.rto_nm,
rcs_0.long_cptn_var

FROM

scr s,
mxr u,
mrt r,
outer(rpr rcs_0)

WHERE

rcs_0.data_el_nm = r.rto_nm AND
(rcs_0.lng = u.lng OR (NOT EXISTS(select * from rpr rcs_1
where rcs_1.rc_id = rcs_0.rc_id AND rcs_1.lng = u.lng)
AND rcs_0.lng = s.bas_lng) OR (NOT EXISTS(select * from rpr rcs_2
where rcs_2.rc_id = rcs_0.rc_id AND rcs_2.lng = u.lng)
AND NOT EXISTS(select * from rpr rcs_3 where
rcs_3.rc_id = rcs_0.rc_id AND rcs_3.lng = s.bas_lng)
AND rcs_0.lng = 'en'))

UNION ALL
SELECT

s.cmpy_id,
u.lgn_id,
"RTONM",
r.rto_nm,
rcs_0.long_cptn_var

FROM

scr s,
mxr u,
mrt r,
outer(rpr rcs_0)

WHERE

rcs_0.data_el_nm = r.rto_nm AND
(rcs_0.lng = u.lng OR (NOT EXISTS(select * from rpr rcs_1
where rcs_1.rc_id = rcs_0.rc_id AND rcs_1.lng = u.lng)
AND rcs_0.lng = s.bas_lng) OR (NOT EXISTS(select * from rpr rcs_2
where rcs_2.rc_id = rcs_0.rc_id AND rcs_2.lng = u.lng)
AND NOT EXISTS(select * from rpr rcs_3 where
rcs_3.rc_id = rcs_0.rc_id AND rcs_3.lng = s.bas_lng)
AND rcs_0.lng = 'en'))

1 个答案:

答案 0 :(得分:2)

很难阅读您的查询或与之相关的解释性文字,我无法看到UNION ALL的目的是什么,因为查询任何一方看起来都相同。在任何情况下,我建议您可能希望探索使用嵌套NVL()CASEDECODE()语句的常规联接。

CREATE VIEW "informix".abc
(
    cmpy_id,
    lgn_id,
    fld_nm,
    data_el_nm,
    desc
)

AS
SELECT
    s.cmpy_id,
    u.lgn_id,
    "RTONM",
    r.rto_nm,
    NVL(mxr_lng.long_cptn_var, NVL(scr_lng.long_cptn_var, NVL(def_lng.long_cptn_var, ' ')))
FROM
    scr AS s,
    mxr AS u,
    mrt AS r,
    outer rpr AS mxr_lng,
    outer rpr AS scr_lng,
    outer rpr AS def_lng
WHERE mxr_lng.data_el_nm = r.rto_nm AND mxr_lng.lng = u.lng
  AND scr_lng.data_el_nm = r.rto_nm AND scr_lng.lng = s.bas_lng
  AND def_lng.data_el_nm = r.rto_nm AND def_lng.lng = 'en'

嵌套NVL()调用将首先从mxr获取long_cptn_var,但如果为NULL则为scr,如果为NULL则为默认值,否则为空格。

显然我无法测试这段代码,但它应该给你一般的想法,即使它在语法上并不完美。