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

Откуда:
Сообщений: 48
Всем доброе время суток!

Есть 3 таблицы:
CREATE TABLE dbo.Parametr(
	
	[AccountID] [int] NOT NULL,
	[SubListID] [int] NOT NULL,
	[DLS] [numeric](20, 2) NULL
	
)
GO
INSERT INTO [Parametr]([AccountID],[SublistID],[DLS])
VALUES  (1,6,679.00000),
		(1,7,679.00000),
		(1,20,679.00000),
		(1,21,679.00000),
		(1,22,679.00000),
		(1,23,679.00000),
		(1,24,679.00000),
		(1,25,679.00000),
		(1,26,679.00000),
		(1,27,679.00000),
		(1,28,679.00000),
		(1,29,679.00000),
		(1,30,679.00000),
		(1,34,679.00000),
		(1,35,679.00000),
		(1,38,679.00000),
		(1,40,679.00000),
		(1,41,679.00000),
		(1,42,679.00000),
		(1,43,679.00000),
		(1,44,679.00000),
		(1,45,679.00000),
		(1,46,679.00000),
		(1,47,679.00000),
		(1,48,679.00000)
GO
CREATE TABLE dbo.[FlowList](
	[AccountID] [int] NULL,
	[SubListID] [int] NULL,
	[FlowAccount] [numeric](20, 2) NULL,
	)
GO
INSERT INTO [FlowList]([AccountID],[SublistID],[FlowAccount])
VALUES(1,6,NULL),
	(1,7,NULL),
	(1,20,NULL),
	(1,21,NULL),
	(1,22,7.0000000000),
	(1,23,NULL),
	(1,24,4.0000000000),
	(1,25,NULL),
	(1,26,NULL),
	(1,27,347.0000000000),
	(1,28,NULL),
	(1,29,NULL),
	(1,30,NULL),
	(1,34,NULL),
	(1,35,NULL),
	(1,38,NULL),
	(1,40,NULL),
	(1,41,NULL),
	(1,42,NULL),
	(1,43,NULL),
	(1,44,NULL),
	(1,45,NULL),
	(1,46,NULL),
	(1,47,NULL),
	(1,48,NULL),
	(1,49,NULL),
	(1,50,NULL),
	(1,51,NULL),
	(1,52,NULL),
	(1,53,NULL),
	(1,54,NULL)
GO
CREATE TABLE dbo.[Tree](
	[SubListID] [int] NOT NULL,
	[ParentID] [int] NULL
) 
GO
  Insert into dbo.Tree
  Values (22,null),
		(23,22),
		(24,null),
		(41,24),
		(43,24)
go


Необходимо соединить Parametr и FlowList по полю AccountID и SublistID согласно дереву в таблице Tree.

Написал вот такой скрипт:
select P.*, F.FlowAccount 
from Parametr P
	left join FlowList F ON P.AccountID = F.AccountID
		and F.SubListID = case 
							when exists (select 1 from Tree where SubListID = P.SubListID)
							then (select isnull(ParentID, SubListID) from Tree where SubListID = P.SubListID) 
							else P.SubListID
						 end
where FlowAccount is not null


Он возвращает правильный результат, но на больших объемах уж очень сильно начинает тормозить.

Подскажите есть ли другой вариант решения данной задачи ?

P.S. Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
18 май 15, 23:52    [17658541]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с написанием хитрого запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20614
from Parametr P
left join FlowList F
...
where F.FlowAccount is not null

вырождается в
from Parametr P
inner join FlowList F
...
where True

Ну и связывание по кейсу - тоже не сахар. Но лениво это развязывать... убирай подзапрос.
19 май 15, 08:55    [17659039]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с написанием хитрого запроса  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2385
Блог
Doctormom,

select P.*, F.FlowAccount 
from Parametr P
	left join FlowList F ON P.AccountID = F.AccountID
		and F.SubListID = case 
							when exists (select 1 from Tree where SubListID = P.SubListID)
							then (select isnull(ParentID, SubListID) from Tree where SubListID = P.SubListID) 
							else P.SubListID
						 end
where FlowAccount is not null


==

select P.*, F.FlowAccount 
from Parametr P
	join FlowList F ON P.AccountID = F.AccountID
		and F.SubListID = isnull(select min(T.ParentID) from Tree T where T.SubListID = P.SubListID),P.SubListID)
19 май 15, 09:14    [17659115]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с написанием хитрого запроса  [new]
Doctormom
Member

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

Данное условие было добавлено только для упрощения отображения результата. Но все равно спасибо. Учту Ваше замечание в будущем.
19 май 15, 10:31    [17659574]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с написанием хитрого запроса  [new]
Doctormom
Member

Откуда:
Сообщений: 48
Павел Воронцов,

Огромное спасибо. Именно то что и требовалось!
19 май 15, 10:32    [17659581]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить