如何使用不同的过滤器改进来自相同 table 的不同值的 UNION
How to improve UNION of distinct values from the same table with different filters
背景:
客户可以创建自己的车辆库存。这意味着他只能展示符合他标准的车辆。
他还可以为用户创建前端过滤器。这些过滤器可以在它们之间同步。例如,如果用户从筛选器 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
...
多个联合将被添加到查询中,并且向所有联合添加不同的过滤器很难索引,我相信是这样。
我应该如何进行以获得更好的性能?我应该以不同的方式检索数据吗?
编辑:
车辆 table 具有如下列
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
很难说出你想要什么,但看起来是:
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;
背景: 客户可以创建自己的车辆库存。这意味着他只能展示符合他标准的车辆。 他还可以为用户创建前端过滤器。这些过滤器可以在它们之间同步。例如,如果用户从筛选器 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
...
多个联合将被添加到查询中,并且向所有联合添加不同的过滤器很难索引,我相信是这样。 我应该如何进行以获得更好的性能?我应该以不同的方式检索数据吗?
编辑: 车辆 table 具有如下列
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
很难说出你想要什么,但看起来是:
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;