背景: 客户可以创建自己的车辆库存。这意味着他只能显示符合其条件的车辆。 他还可以为用户创建前端过滤器。这些过滤器可以在它们之间同步。例如,如果用户从过滤器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
答案 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;