Sql 如何使用不同的筛选器改进同一表中不同值的并集

Sql 如何使用不同的筛选器改进同一表中不同值的并集,sql,sql-server,distinct,union,Sql,Sql Server,Distinct,Union,背景: 客户有可能创建自己的车辆库存。这意味着他只能显示符合其标准的车辆。 他还可以为用户创建前端过滤器。这些过滤器可以在它们之间同步。例如,如果用户从过滤器X中选择某个内容,则过滤器Y仅显示与过滤器X匹配的值 性能问题在于用值填充前端筛选器。 我试过的是这样的 将要向查询中添加多个联合,并且向所有联合添加不同的过滤器很难索引,我相信这一点。 我应该如何继续以获得更好的绩效?我应该以不同的方式检索数据吗 编辑: Vehicles表有如下列 ID ColorID FueltypeID Mile

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

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

将要向查询中添加多个联合,并且向所有联合添加不同的过滤器很难索引,我相信这一点。 我应该如何继续以获得更好的绩效?我应该以不同的方式检索数据吗


编辑: Vehicles表有如下列

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;

使用
UNION ALL
,但查询的目的不清楚。发布示例数据和预期输出。具有大量数据集和大型数据集的
UNION
将成为性能杀手<如果您不希望出现重复项,则代码>联合所有将有所帮助。然而,我不太确定你在这里想要实现什么。样本数据和预期结果在这里可能会有所帮助。请您添加一些数据和所需的输出,以便我们可以尝试更好地解决问题?在我看来,您的问题更可能与您使用的筛选器有关,而不是与UNION语句有关。你是否分别尝试过你的查询?如果它们仍然很慢,那么你的问题是过滤器,你可以向它们展示以了解问题。这是我想要实现的。谢谢:)对其他观众说一句话,选择是用
f.which,f.id
完成的,而不是用
v
别名。我还使用了
distinct
来删除duplicates@Remus . . . 你完全正确。我通常调用
构造
v
,但在本例中已经使用了它。
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;