我是Oracle的新手,正在学习课程,遇到了一些阻碍。我有下面的查询,其中ddetl表由于编写的内部查询逻辑而减慢了查询速度。我想知道是否有任何方法可以进行更改,以便在选择ddetl记录时不使用OR条件。
我只能想到使查询作为动态查询,但我不认为这是一个有效的想法。你能告诉我该怎么办吗?(不期望查询是为我写的,只是想要一个想法)。
SELECT 1,
rcd.id,
sr.id ,
rcd.crit_seq,
rcd.ev_id,
null,
dd.funds_avail_date,
sr.action_allowed,
dd.dsba_id,
decode(sr.detl_level,'Y',dd.seqnbr,null),
dd.ga_id
FROM rc_detail rcd,
ddetl dd,
sr_crit src,
srule sr,
sr_type rt
WHERE rt.id = sr.rule_type
and sr.id = rcd.std_rl_id
and src.std_rl_id = sr.id
and rcd.std_rl_id = src.std_rl_id
and rcd.crit_seq = src.seqnbr
and src.crit_type = 'STD'
and ((nvl(sr.detl_level,'N') != 'Y'
and (dd.dsba_id,dd.ga_id,dd.seqnbr) in
(SELECT MIN(dsba_id),MIN(ga_id), MIN(seqnbr)
FROM ddetl
WHERE dsba_id = v_dsba_id
AND ga_id = v_ga_id))
OR (sr.detl_level = 'Y'
and dd.dsba_id = v_dsba_id
and dd.ga_id = v_ga_id))
and rt.id = 'LOAN-SPEC'
and nvl(rcd.irs_code,'xxxxx') = 'xxxxx'
and nvl(rcd.dsrs_code,'xxxxx') = 'xxxxx'
and nvl(rcd.dsmd_code,'xxxxx') = 'xxxxx'
and nvl(rcd.sdio_id,dd.sdio_id) = dd.sdio_id
and nvl(rcd.sdmt_code,dd.sdmt_code) = dd.sdmt_code
and (nvl(rcd.gaio_qual,dd.gaio_qual) = dd.gaio_qual OR
dd.gaio_qual is null)
and (nvl(rcd.gdmt_seqnbr,dd.gdmt_seqnbr) = dd.gdmt_seqnbr OR
dd.gdmt_seqnbr is null);
我尝试使用“with as”查询进行更改,但它不起作用,或者我无法进行更改,以便查询可以工作。
下面是我想改变的逻辑。
and ((nvl(sr.detl_level,'N') != 'Y'
and (dd.dsba_id,dd.ga_id,dd.seqnbr) in
(SELECT MIN(dsba_id),MIN(ga_id), MIN(seqnbr)
FROM ddetl
WHERE dsba_id = v_dsba_id
AND ga_id = v_ga_id))
OR (sr.detl_level = 'Y'
and dd.dsba_id = v_dsba_id
and dd.ga_id = v_ga_id))
1条答案
按热度按时间dpiehjr41#
对于一个刚接触Oracle的人,我建议你阅读一些更多关于选择和连接表的基本规则的文档。您正在使用的join sintax已经停用了30年。尝试给予别名,以您所选择的列不结束了“列模棱两可的定义”错误。对不起,但是如果没有一些示例数据和没有预期结果,几乎不可能帮助您的代码。我试图重写它看起来像它可以工作。我盲目地做了它,它不会工作,但也许你可以得到一些想法,如何使它与您的实际数据工作。但是,在您的代码中有两个来源不明的标识符,我不知道该如何处理(v_dsba_id和v_ga_id)。下面是代码(带有一些注解),可以帮助您找到摆脱困境的方法:
再一次,这只是一个盲目的尝试猜测什么是真正发生的-这段代码将无法工作,没有你的干预.