Sql oracle查询:不同列上的相同筛选条件
我正在处理查询以提高性能 我看到查询在不同的列上有相同的过滤条件。想想写查询的更好方法是什么Sql oracle查询:不同列上的相同筛选条件,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在处理查询以提高性能 我看到查询在不同的列上有相同的过滤条件。想想写查询的更好方法是什么 select * from table 1 where col1 in (select filter_value from filtertable where id=1) or col2 in (select filter_value from filtertable where id=1) or col3 in (select filter_value from filtertable whe
select *
from table 1
where
col1 in (select filter_value from filtertable where id=1)
or
col2 in (select filter_value from filtertable where id=1)
or
col3 in (select filter_value from filtertable where id=1)
or
col4 in (select filter_value from filtertable where id=1)
or
col5 in (select filter_value from filtertable where id=1)
or
col6 in (select filter_value from filtertable where id=1)
or
col7 in (select filter_value from filtertable where id=1)
or
col8 in (select filter_value from filtertable where id=1)
....... Same condition till col15
我尝试用子句替换filtertable,但没有多大帮助
with filter_temp
(select /*+ materialize */ filter_value from filtertable where id=1)
select *from table 1 , filter_temp
where col1 in (filtertable.filter_value)
or
col2 in (filtertable.filter_value)
or
col3 in (filtertable.filter_value)
or
col4 in (filtertable.filter_value)
or
col5 in (filtertable.filter_value)
or
col6 in (filtertable.filter_value)
or
col7 in (filtertable.filter_value)
or
col8 in (filtertable.filter_value)
....... Same condition till col15
是否有其他方式编写此查询。有一种较短的编写查询的方式使用
:
select t1.*
from table1 t1
where exists (select 1
from filtertable ft
where ft.id = 1 and
ft.filter_value in (t1.col1, t1.col2, . . ., t1.col15)
);
性能应该与较长的版本非常相似,但至少更简洁。我认为“更好”在某种程度上。
真正的解决方案是有一个连接表,这样您就不会在多行的单个列中存储列值,而不是在一行的不同列中存储列值。可能无法修复查询。您可以修复数据模型,这样就不会有15列包含值的“数组”。相反,您需要一个每个值一行的连接/关联表。您的查询的当前性能如何?您希望得到哪些改进?我会支持我的观点,根据我所看到的,你可能不能。您的表/数据模型可能会禁止它。谢谢Gordon Linoff。我假设如果我使用WITH子句,它可以消除对Filtertable的多次读取,但它没有帮助。