Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите с запросом  [new]
любитель запросов
Guest
Коллеги, разум затмился и уже не первый день
+ код
declare @t1 table(id int, group_id int, class_id int)
	insert into @t1
	( id
	, group_id
	, class_id)
	--#region g1
	select
	  1			as id
	, 1			as group_id
	, 1			as class_id
	union all
	select
	  2			as id
	, 1			as group_id
	, 1			as class_id
	--#endregion
	--#region g2
	union all
	select
	  3			as id
	, 2			as group_id
	, 1			as class_id
	union all
	select
	  4			as id
	, 2			as group_id
	, 1			as class_id
	--#endregion
	--#region g3
	union all
	select
	  5			as id
	, 3			as group_id
	, 1			as class_id
	union all
	select
	  2			as id
	, 3			as group_id
	, 1			as class_id
	--#endregion
	--#region g4
	union all
	select
	  6			as id
	, 4			as group_id
	, 1			as class_id
	union all
	select
	  5			as id
	, 4			as group_id
	, 1			as class_id
	union all
	select
	  4			as id
	, 4			as group_id
	, 2			as class_id
	--#endregion
	--#region g5
	union all
	select
	  6			as id
	, 5			as group_id
	, 1			as class_id
	union all
	select
	  7			as id
	, 5			as group_id
	, 1			as class_id
	union all
	select
	  8			as id
	, 5			as group_id
	, 2			as class_id
	--#endregion
select * from @t1

/*результат (частично)*/
select 1 as id, 1 as bound_id union all
select 1 as id, 2 as bound_id union all
select 1 as id, 5 as bound_id union all
select 1 as id, 6 as bound_id union all
select 1 as id, 7 as bound_id union all
select 3 as id, 3 as bound_id union all
select 3 as id, 4 as bound_id union all
select 4 as id, 3 as bound_id union all
select 4 as id, 4 as bound_id union all
select 2 as id, 1 as bound_id union all
select 2 as id, 2 as bound_id union all
select 2 as id, 5 as bound_id union all
select 2 as id, 6 as bound_id union all
select 2 as id, 7 as bound_id /*...*/


Есть группы, содержащие идентификаторы.Есть класс связи внутри группы class_id.
Пример результата (частичный) в конце спойлера. В результат должны войти только те идентификаторы, у которых класс связи 1.
Плиз хелп.
25 сен 12, 12:38    [13218073]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
любитель запросов
Guest
Забыл добавить. В один запрос желательно, но совсем необязательно.
25 сен 12, 12:59    [13218246]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
hallabud
Member

Откуда: Киев
Сообщений: 245
а что такое bound_id?
25 сен 12, 13:11    [13218324]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
любитель запросов
Guest
любитель запросов
/*результат (частично)*/
select 1 as id, 1 as bound_id union all
select 1 as id, 2 as bound_id union all
select 1 as id, 5 as bound_id union all
select 1 as id, 6 as bound_id union all
select 1 as id, 7 as bound_id union all
select 3 as id, 3 as bound_id union all
select 3 as id, 4 as bound_id union all
select 4 as id, 3 as bound_id union all
select 4 as id, 4 as bound_id union all
select 2 as id, 1 as bound_id union all
select 2 as id, 2 as bound_id union all
select 2 as id, 5 as bound_id union all
select 2 as id, 6 as bound_id union all
select 2 as id, 7 as bound_id /*...*/

hallabud
а что такое bound_id?

ммм.
class_id - это тип связи групп
id=1 является членом группы group_id=1 с классом записи class_id=1
id=2 является членом группы group_id=1 и группы group_id=3 везде с классом записи class_id=1
вместе с id=2 в группе group_id=3 есть id=5 тоже с классом записи class_id=1
Кроме того, id=5 вместе с id=6 входят в группу group_id=4 и оба также с классом записи class_id=1
Аналогично id=6 и id=7 оба с class_id=1 в группе 5
Это означает что id 1, 2, 5, 6, 7 "связаны" друг с другом

При этом id=8 и id=4 хоть и входят в группы 5 и 4 но с 1 связи не имеют, поскольку class_id=2.

В результате для каждого id нужно указать все пары, которые имеют прямую или опосредованную связь с class_id=1.
предполагается что замкнутого графа быть не может
Извиняюсь за сумбурность описания.
25 сен 12, 13:33    [13218547]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Добрый Э - Эх
Guest
любитель запросов
В результате для каждого id нужно указать все пары, которые имеют прямую или опосредованную связь с class_id=1.
предполагается что замкнутого графа быть не может


Дерево, что ли, у тебя? Тогда рекурсивный CTE тебе в помощь
25 сен 12, 16:09    [13219883]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
любитель запросов
Guest
Добрый Э - Эх
Дерево, что ли, у тебя? Тогда рекурсивный CTE тебе в помощь
Не дерево, но рекурсия может и поможет. Просто никак не соображу, как её сюда присобачить.
Нехорошо то, что один и тот же id в нескольких группах может быть. Приходится накапливать в строке ветку для какого id я считаю связанных id-шников.
И не получается никак. Вот
25 сен 12, 16:51    [13220218]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
aleks2
Guest
Без CTE и требует некоторой полировки...
declare @t1 table(id int, group_id int, class_id int)
	insert into @t1
	( id
	, group_id
	, class_id)
	--#region g1
	select
	  1			as id
	, 1			as group_id
	, 1			as class_id
	union all
	select
	  2			as id
	, 1			as group_id
	, 1			as class_id
	--#endregion
	--#region g2
	union all
	select
	  3			as id
	, 2			as group_id
	, 1			as class_id
	union all
	select
	  4			as id
	, 2			as group_id
	, 1			as class_id
	--#endregion
	--#region g3
	union all
	select
	  5			as id
	, 3			as group_id
	, 1			as class_id
	union all
	select
	  2			as id
	, 3			as group_id
	, 1			as class_id
	--#endregion
	--#region g4
	union all
	select
	  6			as id
	, 4			as group_id
	, 1			as class_id
	union all
	select
	  5			as id
	, 4			as group_id
	, 1			as class_id
	union all
	select
	  4			as id
	, 4			as group_id
	, 2			as class_id
	--#endregion
	--#region g5
	union all
	select
	  6			as id
	, 5			as group_id
	, 1			as class_id
	union all
	select
	  7			as id
	, 5			as group_id
	, 1			as class_id
	union all
	select
	  8			as id
	, 5			as group_id
	, 2			as class_id

declare @t table (pid int, bid int, gid int, l int );
declare @l int, @rc int

insert @t 
select id as pid, id as bid, group_id as gid, 0 as l from ( select * from @t1 where class_id = 1 ) c1;
set @rc = @@rowcount;
set @l = 0;

while @rc > 0
begin 

-- та же группа - другой bid
insert @t
select t.pid, c1.id as bid, t.gid, @l+1 as l 
  from (select * from  @t where l = @l) t inner join ( select * from @t1 where class_id = 1 ) c1
  on t.gid = c1.group_id and c1.id > t.pid
  where
  not exists(select pid, bid, gid from @t intersect select t.pid, c1.id, t.gid)
set @rc = @@rowcount;
  
-- этот bid в другой группе
insert @t
select t.pid, t.bid, c1.group_id as gid, @l+1 as l 
  from (select * from  @t where l = @l and  pid < bid) t inner join ( select * from @t1 where class_id = 1 ) c1
  on t.bid = c1.id and c1.group_id > t.gid
  where
  not exists(select pid, bid, gid from @t intersect select t.pid, t.bid, c1.group_id)
  
set @rc = @rc + @@rowcount;
set @l = @l+1;
end;

-- результат (требующий полировки)
select pid, bid from @t 
group by pid, bid
25 сен 12, 18:05    [13220861]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить