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

Откуда: Екатеринбург
Сообщений: 310
Есть большая таблица [Data] около 100 миллионов записей.
CREATE TABLE [Data](
        ......
	[field1] [int] NOT NULL,
	[field2] [int] NOT NULL,
	[field3] [int] NOT NULL,
	[field4] [int] NOT NULL,
	[field5] [int] NOT NULL,
	[field6] [int] NOT NULL,
	[field7] [int] NOT NULL,
	[field8] [int] NOT NULL,
	[field9] [int] NOT NULL,

	[parametr1] [int] NOT NULL,
	[parametr2] [int] NOT NULL,
	[parametr3] [int] NOT NULL,
        ......
)

И есть таблица [Dictionary] менее 3 тысяч записей
CREATE TABLE [Dictionary](
	[id] [int] NOT NULL,
        ......	
)


Нужно
1)Отобрать из таблицы [Data] строки, удовлетворяющие условию
where [parametr1] = @parametr1
   and [parametr2] = @parametr2
   and [parametr3] = @parametr3


2)А затем вывести уникальный набор строк из [Dictionary] такой, что [Dictionary].[id] равен одному или нескольким полям [field1]-[field9]

Получается, что-то типа такого кода(плохой вариант)
	select 
	     [Dictionary].*
	from [Dictionary]
	where [id] in (
		      select [field1] from [Data] where [parametr1] = @parametr1
                                                     and [parametr2] = @parametr2
                                                     and [parametr3] = @parametr3
		union select [field2] from [Data] where [parametr1] = @parametr1
                                                     and [parametr2] = @parametr2
                                                     and [parametr3] = @parametr3
...........................................................................................
		union select [field9] from [Data] where [parametr1] = @parametr1
                                                     and [parametr2] = @parametr2
                                                     and [parametr3] = @parametr3
    )

Или такого
	select 
	  Dictionary.*
	from [Dictionary]
	where [Dictionary].[id] in(
				select distinct
				  [Dictionary].[id]							
				from [Dictionary]
				inner join [Data]
				on [Dictionary].[id] in (
					 [field1],[field2],[field3]
					,[field4],[field5],[field6]
					,[field7],[field8],[field9]
				)
				where [parametr1] = @parametr1
                                   and [parametr2] = @parametr2
                                   and [parametr3] = @parametr3
	)


Кто как поступает в подобных ситуациях? Есть ли универсальное решение?
18 май 12, 14:16    [12577104]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение по нескольким параметрам  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Попробуй как-нибудь так ну с индексами конечно
declare @t table (field1 int, field2 int, param1 int)
declare @t2 table (id int)

insert into @t(field1 ,field2 ,param1)
values(1,1,1)
,(null,1,1)
,(2,2,2)

insert into @t2(id)
values(1)
,(2)

;with fieldsFromDic(field) as(
select distinct
 field
from	@t t
		cross apply(select field = n   
					from (values(t.field1),(t.field2))f(n)
					
		)fields
where t.param1 = 1
)
select 
	t2.id
from	fieldsFromDic fd		
		inner join @t2 t2
		on	t2.id = fd.field
		
18 май 12, 15:17    [12577747]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение по нескольким параметрам  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
unpivot
18 май 12, 15:19    [12577780]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение по нескольким параметрам  [new]
.Anatoly.
Member

Откуда: Екатеринбург
Сообщений: 310
HandKot, unpivot оказался самым быстрым вариантом.
Спасибо
22 май 12, 10:23    [12592435]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить