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

Откуда:
Сообщений: 336
В рамках работы по изучению спроса в интернет-магазине, поставили нетривиальную задачу.
Не пинайте сильно, задача такая, что объяснить даже трудно, голову сломал, и всё же...

Есть большая таблица соответствий между идентификаторами [id1] int not null и [id2] int not null.
На основе этой таблицы была создана таблица уникальных пар [id1] и [id2]
select distinct [id1],[id2] into #Pairs from
(
   select distinct [id1],[id2] from [BigTable] union
   select [id2],[id1] from [BigTable]
) A


Идентификатор [id1] может соответствовать нескольким идентификаторам [id2], образуя некую группу :
1000 - 11037
1000 - 22371
1000 - 1037
1000 - 8779
Как получить список идентификаторов [id1], такие что соответствующая кажому из них группа из [id2] соответстуют только исходному [id1] либо члену группы, но НЕ ВЫХОДИТ из группы?
Например, вот это будет искомое
11037 - 1000
22371 - 1000
1037 - 1000
8779 - 1000
22371 - 1037
11037 - 8779
А вот это - уже нет
11037 - 1000
22371 - 1000
1037 - 1000
8779 - 1000
22371 - 1037
11037 - 8779
22371 - 2000 - выходит из группы
26 июл 16, 17:10    [19458251]     Ответить | Цитировать Сообщить модератору
 Re: Каверзный запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
=Сергей=,

а зачем Вы меняете значения колонок местами?

Постройте иерархический список, добавьте третью колонку со значением головной записи группы, сравнивайте головы.
26 июл 16, 17:34    [19458364]     Ответить | Цитировать Сообщить модератору
 Re: Каверзный запрос  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Владислав Колосов,

В данном случае, мне не принципиально, что на что ссылается.
26 июл 16, 17:52    [19458459]     Ответить | Цитировать Сообщить модератору
 Re: Каверзный запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
=Сергей=,

Вы же сами иерархию нарисовали:
11037 - 1000
22371 - 1000
1037 - 1000
8779 - 1000
22371 - 1037
11037 - 8779
26 июл 16, 18:40    [19458651]     Ответить | Цитировать Сообщить модератору
 Re: Каверзный запрос  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Владислав Колосов,

Если не затруднит, хотя бы на пальцах методику, но чуть подробнее
26 июл 16, 20:38    [19459038]     Ответить | Цитировать Сообщить модератору
 Re: Каверзный запрос  [new]
aleks2
Guest
=Сергей=
Владислав Колосов,

Если не затруднит, хотя бы на пальцах методику, но чуть подробнее


declare @id int = 1000;
with
  i as ( select id2 as id from #Pairs where id1 = @id union select @id )
  select * from #Pairs where id1 in (select id from i ) and id2 in (select id from i );
26 июл 16, 20:43    [19459053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить