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

Откуда:
Сообщений: 30210
Есть несколько таблиц соединённых по UNION ALL и в каждой из них надобно вставить отбор по параметру (который можно в каждой получить соединением с таблицей этих параметров)... проблема в том что таблица этих параметров построена так что параметр одного параметра является в свою очередь другим параметром более высшего уровня и т.д. (кол-во таких параметров в определённый момент состояния конфигурации БД постоянно)

может если кто работал с 1С - то таблица парметров - таблица иерархического справочника а параметры отбора элементов - группы... т.е. у элемента (тот что в регистрах элемент) есть свой родитель а у родителя свой родитель и т.д.

если просто связать эти объединения левым соединением с таблицей этого справочника по элементам но с отборам по вхождению в одну из групп то получается надо весь справочник "тягать" с группировкой по группам что небыстро получается

вот всвязи с чем вопрос - как этот отбор лучше организовать по-другому

делать же запрос сначала по выборке всех элементов вообще входящих в искомые группы а потом использовать в основном запросе их в IN (тем самым проверяя на вхождение в каждом из подзапросов несколько десятков тысяч элементов по каждой записи) тоже не быстро

а если как-то процедурой в самых нижних условиях проверять рекурсивно всех родителей конкретного поля возвращая ответ уже по условию отбираем конкретную запись или нет ?

это чем вообще можно реализовать ? хранимой процедурой или как ещё ?

п.с. для 1цешников как организовать в запросе вызов внешней функции "когда" ?
14 авг 09, 17:51    [7541184]     Ответить | Цитировать Сообщить модератору
 Re: Отбор по большому количеству значений  [new]
Var79
Member

Откуда:
Сообщений: 890
Last1Cmen
п.с. для 1цешников как организовать в запросе вызов внешней функции "когда" ?


ниче не понял

а вообще если нужно получить все элементы иерархии можно использовать CTE
CTE в SQL 2000 нет
14 авг 09, 19:34    [7541555]     Ответить | Цитировать Сообщить модератору
 Re: Отбор по большому количеству значений  [new]
Last1Cmen
Member

Откуда:
Сообщений: 30210
Var79, не... не совсем то... вернее оно может пригодиться в качестве временной таблицы но не совесм оно

[url=]https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=686400&hl=#7519518[/url]

это похожий запрос... там последний INNER JOIN как раз и соединяет основной запрос с запросом по иерархическому справочнику в котором я могу применить фильтр по одной из групп НО вопрос в том зачем мне тянуть всю таблицу этих групп если может быть есть возможность отфильтровать элементы ещё на этапе первых двух запросов объединения UNION ALL без выполения запроса к всей таблице элементов с их группами

потому я и написал что если поможет - нужен аналог "когда" (т.е. нужен вызов внешенй функции осуществляющей проверку на вхождение всех групп элемента в необходимый фильтр по группам ) как в 1С 7.7 есть
16 авг 09, 11:58    [7543353]     Ответить | Цитировать Сообщить модератору
 Re: Отбор по большому количеству значений  [new]
Last1Cmen
Member

Откуда:
Сообщений: 30210
пришлось делать через хранимую функцию которая перебирает всех родителей и возвращает или 1 или 0

CREATE FUNCTION INParent 
(
	@NomID char(9),@ParentID char(9)
)
RETURNS int
AS
BEGIN
		WHILE @NomID <> '     0   '
		BEGIN
			SELECT @NomID = PARENTID FROM  SC282 WHERE ID = @NomID
			IF 	@NomID = @ParentID 	
				RETURN 1
			END

	RETURN 0

END
GO


и вызов в проверках

WHERE
		dbo.INParent(SP565,@_group_S) = 1
18 авг 09, 10:43    [7549904]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить