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的多次读取,但它没有帮助。