我正在使用nvl检查值。如果第一条语句返回空值,则将执行第二条语句。但这会使查询时间加倍。还有更好的方法吗?
nvl(
(
select * from (
select tad.ASP_NAME
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
)
where ROWNUM = 1
)
,
(
select * from (
select tad.ASP_NAME
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
)
where ROWNUM = 1
)
) ASP_NAME
,nvl(
(
select * from (
select tad.TIERING_2
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
)where ROWNUM = 1
)
,
(
select * from (
select tad.TIERING_2
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
) where ROWNUM = 1
)
) TIERING_2
,nvl(
(
select * from (
select tad.TIERING_1
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
)where ROWNUM = 1
)
,
(
select * from (
select tad.TIERING_1
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
)where ROWNUM = 1
)
)TIERING_1,
答案 0 :(得分:1)
我们只需要继续执行NVL片段,其余的就不行了,我从te1.last_name引用中可以看到这是一个相关的子查询,因为te1不在上述代码片段之内。
一个大概的想法是,您需要将两个查询连接在一起而不是重复它们-在这种情况下,基于te1.last_name进行连接,因为这似乎是您想要的,但没有其余的查询以了解上下文,我不确定。
一旦加入,您就可以使用nvl(或者合并使用更多的ANSI方法)
从性能角度来看,这总是会有一些问题,因为您在where子句中使用了完整的通配符搜索,并且使用了较低的功能。
select
coalesce(x.asp_name, y.asp_name) as asp_name
, coalesce(x.tiering_2, y.tiering_2) as tiering_2
, coalesce(x.tiering_1, y.tiering_1) as tiering_1
from (
select * from (
select
te1.last_name, tad.ASP_NAME, tad.TIERING_2,tad.TIERING_1
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
)
where ROWNUM = 1
) x
full join (
select * from (
select te1.last_name, tad.ASP_NAME, tad.TIERING_2,tad.TIERING_1
from TBL_ASP_DETAILS tad
where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
)
where ROWNUM = 1
) y on x.last_name = y.last_name
答案 1 :(得分:1)
您可以使用ORDER BY
和FETCH
简化子查询。因此,我不确定这是否有助于执行时间,但是由于您的条件不可索引,因此应该减少执行时间:
SELECT * FROM TBL_ASP_DETAILS tad
WHERE lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
OR lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
ORDER BY CASE WHEN lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%' THEN 0 ELSE 1 END
FETCH FIRST ROW ONLY