Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Фильтрация справочника  [new]
Vikong
Member

Откуда:
Сообщений: 85
Вопрос знатокам MS SQL.
Во многих вьюхах/запросах используется фильтрованный справочник клиентов. То есть менеджеры, отвечающие за определенных клиентов, хотят видеть записи, относящиеся только к "их" клиентам. Сейчас есть три таблицы: "справочник клиентов", "справочник фильтров", "клиенты для фильтра" и вьюха отфильтрованных клиентов. Проблема состоит в том, что иногда требуется видеть записи, относящиеся к любым клиентам, в том числе тем, кто не добавлен в "клиенты для фильтра", не переключаясь на другое окно, в той же самой вьюхе. Как бы "покрасивше" это сделать?
26 фев 13, 15:44    [13983559]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Vikong
иногда требуется видеть записи, относящиеся к любым клиентам, в том числе тем, кто не добавлен в "клиенты для фильтра", не переключаясь на другое окно, в той же самой вьюхе

"Иногда" — это когда, в каких случаях? Видеть кому? Всем менеджерам, одному определённому менеджеру?
Битовый признак менеджера "видеть всех клиентов" решит поставленную задачу?
26 фев 13, 16:10    [13983784]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
_ч_
Member

Откуда:
Сообщений: 1427
Vikong,

Что-то такое?

create table Customers(IdCustomer int identity, CustomerName nvarchar(100))
create table Customer_Filter(Id int identity (1,1), IdCustomer int, IdFilter Int)
create table Filters(IdFilter int, FilterName nvarchar(100))


insert into Customers(CustomerName)
select 'ООО Добрые люди'
union
select 'ЗАО Инвест'
union
select 'ООО Лопух и ко'
union
select 'LLC Petrov&Son Inc'


insert into Filters
select 1, 'Фильтр1'
union
select 2, 'Фильтр2'

insert into Customer_Filter(IdCustomer, IdFilter)
select 1, 1
union
select 2, 1
union
select 3, 2

declare @pWithoutFiler bit = 0


select * from Customers
left join Customer_Filter on Customers.IdCustomer = Customer_Filter.IdCustomer
where Idfilter = 1 or (@pWithoutFiler = 1)

set @pWithoutFiler = 1

select * from Customers
left join Customer_Filter on Customers.IdCustomer = Customer_Filter.IdCustomer
where Idfilter = 1 or (@pWithoutFiler = 1)
26 фев 13, 16:12    [13983791]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Vikong
Member

Откуда:
Сообщений: 85
_ч_,

Пожалуй, я не совсем правильно озвучил задачу. То есть, предложенное Вами решение работает, но хотелось бы иметь возможность фильтровать данные, не прибегая каждый раз к связкам вида Customers INNER JOIN Customer_Filter, а использовать более простой для восприятия запрос.
Например
--нифига не создастся вьюха из-за наличия переменных
CREATE VIEW [dbo].[v_FilteredCust]
AS
SELECT Customer_Filter.IdCustomer, Filters.FilterName
FROM Customer_Filter 
INNER JOIN Filters ON Customer_Filter.IdFilter = Filters.IdFilter
WHERE (dbo.Filters.FilterName = @filterName or (@pWithoutFiler = 1))

и дальше
select * from dbo.Customers 
where IdCustomer in (select IdCustomer from v_FilteredCust)


Жаль, в данном случае, это не работает :(
26 фев 13, 16:57    [13984171]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Vikong
Member

Откуда:
Сообщений: 85
В общем, это связано с тем, что практически в каждом запросе используется фильтрация по клиентам. Каждый раз писать INNER JOIN во-первых, ухудшает "читаемость" запросов, а во-вторых, если что-то поменяется в логике фильтра, то придётся переписывать все! 8-0 запросы.
26 фев 13, 17:03    [13984228]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Vikong
Member

Откуда:
Сообщений: 85
Гость333
"Иногда" — это когда, в каких случаях? Видеть кому? Всем менеджерам, одному определённому менеджеру?
Битовый признак менеджера "видеть всех клиентов" решит поставленную задачу?

"Иногда" - это почти всегда. В почти каждой вьюхе, для каждого менеджера.
Битовый признак менеджера задачу не решает, так как менеджер, работая со списком "своих" клиентов, должен одновременно иметь возможность просмотреть список всех клиентов.
26 фев 13, 17:19    [13984314]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Vikong
Битовый признак менеджера задачу не решает, так как менеджер, работая со списком "своих" клиентов, должен одновременно иметь возможность просмотреть список всех клиентов.
Можно сделать битовый признак "для текущего менеджера" у вьюхи.

Соответсвенно, приложение будет использовать вьюху с фильтром по этому полю, либо без фильтра.

Тогда и логика будет только во вьюхах, и смотреть можно хоть свои, хоть все записи, и даже сделать более сложную логику.
26 фев 13, 17:30    [13984377]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Vikong,

Можно использовать inline udf вместо представления.
Например, для таблиц из примера _ч_
create function dbo.CustomersForFilter1(@pWithoutFilter bit)
returns table
as return
(   select c.* from Customers c
    left join Customer_Filter cf on c.IdCustomer = cf.IdCustomer
    where cf.Idfilter = 1 or (@pWithoutFilter = 1)
);
go

select * from dbo.CustomersForFilter1(0);
select * from dbo.CustomersForFilter1(1);
26 фев 13, 17:31    [13984381]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Vikong
Member

Откуда:
Сообщений: 85
Гость333
Vikong,

Можно использовать inline udf вместо представления.
create function dbo.CustomersForFilter1(@pWithoutFilter bit)
...

Пожалуй, это то, что нужно. А использование подобных udf не будет замедлять выполнение запросов?
26 фев 13, 17:41    [13984441]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Vikong
Member

Откуда:
Сообщений: 85
alexeyvg
Можно сделать битовый признак "для текущего менеджера" у вьюхи.
Соответсвенно, приложение будет использовать вьюху с фильтром по этому полю, либо без фильтра.
Тогда и логика будет только во вьюхах, и смотреть можно хоть свои, хоть все записи, и даже сделать более сложную логику.

Что-то такое в голове вертится, но мысль поймать не могу. Если не затруднит, можно подробнее?
26 фев 13, 17:46    [13984468]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация справочника  [new]
Vikong
Member

Откуда:
Сообщений: 85
Потестировал варианты с функциями, вьюхами и прямыми запросами. Функции дают незначительное ухудшение производительности, по сравнению с прямыми запросами (на моих данных, примерно, на 4%).
27 фев 13, 12:22    [13987644]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить