Optimization informix中默认值的优化查询

Optimization informix中默认值的优化查询,optimization,views,informix,default-value,Optimization,Views,Informix,Default Value,要求:创建一个视图,其中记录来自4个表 第一个字段来自scr,第二个字段来自mxr,第三个字段是mrt的默认第四个字段 第五个是基于语言的desc,条件如下 mxr中有一个lng字段,需要借助数据_el_nm和lng(mxr的)读取rpr,如果未找到记录,则借助数据_el_nm和lng(scr的)读取rpr,如果未找到,则借助数据_el_nm和默认lng(为en)读取rpr。。如果三个字段都没有找到,直到处理完为止,请在字段中加空格。我是通过在rpr上加外线来实现的,但这需要很多时间。有谁能提出

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

第五个是基于语言的desc,条件如下 mxr中有一个lng字段,需要借助数据_el_nm和lng(mxr的)读取rpr,如果未找到记录,则借助数据_el_nm和lng(scr的)读取rpr,如果未找到,则借助数据_el_nm和默认lng(为en)读取rpr。。如果三个字段都没有找到,直到处理完为止,请在字段中加空格。我是通过在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'))

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

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\u cptn\u var
,但如果为NULL,则为scr,如果为NULL,则为默认值,否则为空格


显然,我无法测试这段代码,但即使它在语法上不完美,它也应该能为您提供大致的想法。

很难阅读您的查询或与之相关的解释性文本,而且我看不出
UNION ALL
的目的是什么,因为两边的查询看起来都是相同的。在任何情况下,我建议您可能希望探索使用嵌套的
NVL()
,或
case
DECODE()
语句的常规联接

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\u cptn\u var
,但如果为NULL,则为scr,如果为NULL,则为默认值,否则为空格


显然,我无法测试这段代码,但即使它在语法上不完美,它也应该能给您提供大致的想法。

谢谢。我找到了另一种方法。我制作了一个函数,可以为caption变量赋值。这使查询运行得非常快。。谢谢你的时间…谢谢..我找到了另一种方法..我做了一个函数,它会给caption变量赋值..这使得查询运行得非常快。。谢谢你抽出时间。。