我有一个关于查询的性能问题,需要读取一个过滤表来获取筛选器,并读取与这些筛选器相关的源数据表。 因此,我的筛选器表看起来像这样;
FILTER_ID CUSTOMER COUNTRY DEPARTMENT
1 UK DEP1
2 CUS1 US DEP1
3 CUS1
这是我的源数据表格:
ROW_NO CUSTOMER COUNTRY DEPARTMENT
1 CUS1 UK DEP1
2 CUS2 UK DEP1
3 CUS3 UK DEP1
4 CUS1 US DEP1
5 CUS1 SG DEP3
6 CUS1 UK DEP3
对于筛选器表中的每个筛选器,我需要从源数据表中获取行。但是,如果FILTER表中的列为空,我们需要读取源数据表中存在的该列的所有成员。假设对于FILTER_ID 1,我们需要从源表中读取所有COUNTRY = UK和DEPARTMENT = DEP1的客户。
结果表应如下所示;
FILTER_ID ROW_NO CUSTOMER COUNTRY DEPARTMENT
1 1 CUS1 UK DEP1
1 2 CUS2 UK DEP1
1 3 CUS3 UK DEP1
2 4 CUS1 US DEP1
3 1 CUS1 UK DEP1
3 4 CUS1 US DEP1
3 5 CUS1 SG DEP3
3 6 CUS1 UK DEP3
我正在使用条件连接,它正常工作,但问题是,速度非常慢!
select t1.FILTER_ID, t2.* from FILTER_TABLE as t1
inner join SOURCE_DATA as t2 on
CASE WHEN t1.CUSTOMER = '' THEN t2.CUSTOMER ELSE t1.CUSTOMER END = t2.CUSTOMER and
CASE WHEN t1.DEPARTMENT = '' THEN t2.DEPARTMENT ELSE t1.DEPARTMENT END = t2.DEPARTMENT and
CASE WHEN t1.COUNTRY = '' THEN t2.COUNTRY ELSE t1.COUNTRY END = t2.COUNTRY
有没有一种方法可以优化这段代码?
CASE
语句重写为OR
的组合(因为t2.CUSTOMER = t2.CUSTOMER
几乎每次都可以通过(除非t2.CUSTOMER
为NULL
)),例如:((t1.CUSTOMER = '') OR (t1.CUSTORMER <> '' AND t1.CUSTOMER = t2.CUSTOMER))
。请检查并告诉我们结果。 - Rokuto