如何使用不同的过滤器改进来自同一表的不同值的UNION

时间:2019-02-07 11:16:25

标签: sql sql-server distinct union

背景: 客户可以创建自己的车辆库存。这意味着他只能显示符合其条件的车辆。 他还可以为用户创建前端过滤器。这些过滤器可以在它们之间同步。例如,如果用户从过滤器X中选择某项,则过滤器Y仅显示与X过滤器匹配的值

性能问题在于用值填充前端过滤器。 我试过的就是这样

;with v as(  
select something from vehicles  
where [his stock filters])  
select 'XFilter',X_id from v where Y_id > [value] and Z_id > [value] 
union  
select 'YFilter',Y_id from v where X_id > [value] and Z_id > [value] 
union  
select 'ZFilter',Z_id from v where X_id > [value] and Y_id > [value] 
union 
...  

多个联合将被添加到查询中,并且为所有联合添加不同的过滤器很难索引,所以我相信。 我应该如何进行以获得更好的性能?我应该以其他方式检索数据吗?


编辑: 车辆表中的列如下所示

ID ColorID FueltypeID Mileage ...
1    1        1         1000
2    1        2         500
3    2        2         2000
4    2        1         1500
5    3        1         9000
6    3        2         8000

使用上面的查询,我想为过滤器提取所有不同的值,这些过滤器具有一组有限的值,例如颜色和燃料类型。 预期结果将是

     reference value
1     Color      1
2     Color      2
3     Color      3
4     Fueltype   1
5     Fueltype   2

1 个答案:

答案 0 :(得分:1)

真的很难说出您想要什么,但这似乎是:

with v as (  
      select something
      from vehicles  
      where [users stock filters]) 
     )
select f.which, f.id
from v cross apply
     (values ('XFilter', v.x_id, (case when Y_id > [value] and Z_id > [value] then 1 else 0 end) ),
             ('YFilter', v.y_id, (case when X_id > [value] and Z_id > [value] then 1 else 0 end) ),
             ('ZFilter', v.z_id, (case when X_id > [value] and Y_id > [value] then 1 else 0 end) )
     ) f(which, id, outcome)
where f.outcome = 1;