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