我有一个模糊匹配要求..对于ex;
Table1 - T1Col1, T1col2, T1col3, T1col4, T1col5.
Table 2 - T2Col1, T2col2, T2col3, T2col4, T2col5.
所以我的要求是
T1 - 不需要所有字段,即T1col1,T1col2,T1col3,T1col4, T1col5不是空值,但有T1Col2的情况 填充并且T1Col3,T1Col4和5为空。最佳案例场景 是所有字段都不是空的,最坏的情况是除了T1Col1休息 这些字段是空的。
我想出了一个模糊逻辑匹配,以便至少有一个字段 然后匹配'其中'条款应该通过。
select count(*) from T1, T2
where
Nvl(T1COl1, nvl(T2Col1, 'x')) = nvl(T2Col1, 'x') and
Nvl(T1COl2, nvl(T2Col2, 'x') ) = nvl(T2Col2, 'x') and
Nvl(T1COl3, nvl(T2Col3, 'x')) = nvl(T2Col3, 'x') and
Nvl(T1COl4, nvl(T2Col4, 'x')) = nvl(T2Col4 'x') and
and substr(T1COl5, 1,1) = T2Col5
;
T1和T2中的记录计数分别为243000和55000条记录 当我运行上述语句时,需要1426.809秒,并给了我11349条记录。看起来性能很差。 是因为在where子句中使用substr或使用了太多的NVL?
您能在这里帮助我如何提高查询效果,还是有更好的方法进行匹配?
答案 0 :(得分:0)
也许只是个人偏好,但我会把它写成:
select count(*)
from t1
,t2
where (t1col1 is null or t1col1 = t2col1)
and (t1col2 is null or t1col2 = t2col2)
and (t1col3 is null or t1col3 = t2col3)
and (t1col4 is null or t1col4 = t2col4)
and substr(t1col5, 1, 1) = t2col5;
此查询中的逻辑略有不同。此查询与值' x'不匹配。在t1col1中为t2col1中的空值。