Как улучшить UNION отдельных значений из одной таблицы с разными фильтрами - PullRequest
0 голосов
/ 07 февраля 2019

Справочная информация: у клиента есть возможность создать собственный запас транспортных средств.Это означает, что он может отображать только автомобили, которые соответствуют его критериям.У него также есть возможность создавать веб-фильтры для пользователей.Эти фильтры могут синхронизироваться между ними.Например, если пользователь выбирает что-то из фильтра 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 голосов
/ 07 февраля 2019

Действительно трудно сказать, что вы хотите, но это выглядит так:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...