要求:创建一个视图,其中记录来自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'))
答案 0 :(得分:2)
很难阅读您的查询或与之相关的解释性文字,我无法看到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_cptn_var
,但如果为NULL则为scr,如果为NULL则为默认值,否则为空格。
显然我无法测试这段代码,但它应该给你一般的想法,即使它在语法上并不完美。