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

Откуда:
Сообщений: 64
Highschooler ( ID, name, grade )
English: There is a high school student with unique ID and a given first name in a certain grade.

Friend ( ID1, ID2 )
English: The student with ID1 is friends with the student with ID2. Friendship is mutual, so if (123, 456) is in the Friend table, so is (456, 123).

Likes ( ID1, ID2 )
English: The student with ID1 likes the student with ID2. Liking someone is not necessarily mutual, so if (123, 456) is in the Likes table, there is no guarantee that (456, 123) is also present.

__________________________________
For all cases where A is friends with B, and B is friends with C, add a new friendship for the pair A and C. Do not add duplicate friendships, friendships that already exist, or friendships with oneself.
_____________________________________
12 фев 13, 00:18    [13911473]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
Тестовые задания нужно решать самостоятельно.
12 фев 13, 00:24    [13911484]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
leapold
Member

Откуда:
Сообщений: 64
Уже голову сломал на нем .Весь день хожу вокруг до около
12 фев 13, 00:27    [13911491]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
aleks2
Guest
declare @Friend table( ID1 int, ID2 int ) 

insert @Friend
select 2, 1
union all
select 2, 3
union all
select 4, 1
union all
select 5, 6


-- 1. Приводим @Friend к ID1 < ID2 

update @Friend set id1 = id2
                  ,id2 = id1
where id1>id2;

select * from @friend;

-- 2. ваяем пары
;with
-- все пары "A is friends with B, and B is friends with C, add a new friendship for the pair A and C"
--, за вычетом "friendships with oneself"
allpairs as (
	select F1.id2 as id1, F2.id2 as id2
	from @Friend F1 inner join @Friend F2 on F1.id1=F2.id1
	where F1.id2 <> F2.id2 
	union
	select F1.id2 as id1, F2.id1 as id2
	from @Friend F1 inner join @Friend F2 on F1.id1=F2.id2
	where F1.id2 <> F2.id1 
	union
	select F1.id1 as id1, F2.id2 as id2
	from @Friend F1 inner join @Friend F2 on F1.id2=F2.id1
	where F1.id1 <> F2.id2 
	union
	select F1.id1 as id1, F2.id1 as id2
	from @Friend F1 inner join @Friend F2 on F1.id2=F2.id2
	where F1.id1 <> F2.id1 
)
--select * from allpairs;
,
-- нормализованные пары, "id1 < id2" без повторов
normalpairs as
(select distinct
        (select min(id1) from (select id1 union all select id2) X) as id1
      , (select max(id1) from (select id1 union all select id2) X) as id2
   from allpairs)
--select * from normalpairs;
,
-- не существующие пары
nonexistingpairs as
( select * from normalpairs
  except
  select * from @Friend
)
-- ну и фсе
insert @Friend
select * from nonexistingpairs;

select * from @friend;
12 фев 13, 05:51    [13911690]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3348
Гавриленко Сергей Алексеевич,

Прикол декларативных языков в том, что на самом деле написать решение можно :). Другой вопрос, что решение, которое ТС не смог сам написать, он вряд ли сможет понять, не говоря уже о том, чтобы его объяснить другим. Тут-то его за жабры и возьмут
12 фев 13, 06:17    [13911696]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
leapold
Member

Откуда:
Сообщений: 64
Спасибо за ответ.
Решение правильное но очень сложное.
Я уверен что можно сделать легче.
Сижу копаю дальше
12 фев 13, 10:13    [13912206]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
Ennor Tiegael
Member

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

Решение неправильное, т.к. оно основывается на неправильно понятом условии. aleks2 счел, что зеркальные записи (id2, id1) в таблице Friend отсутствуют, в то время как в условии явно сказано иное:
автор
Friendship is mutual, so if (123, 456) is in the Friend table, so is (456, 123)
Хотя я не исключаю, что оно будет работать на правильных данных.
12 фев 13, 10:30    [13912306]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
требуется ли по постановке задачи из цепочек (1,2)(2,4)(4,6) и (1,3)(3,5)(5,7) выводить (6,7)? Или только ближайших друзей?
12 фев 13, 10:40    [13912365]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
aleks2
Guest
leapold
Спасибо за ответ.
Решение правильное но очень сложное.
Я уверен что можно сделать легче.
Сижу копаю дальше

Копай, копай.

Ennor Tiegael
leapold,
Решение неправильное, т.к. оно основывается на неправильно понятом условии. aleks2 счел, что зеркальные записи (id2, id1) в таблице Friend отсутствуют, в то время как в условии явно сказано иное:
автор
Friendship is mutual, so if (123, 456) is in the Friend table, so is (456, 123)
Хотя я не исключаю, что оно будет работать на правильных данных.

Это просто условие неправильное. Надо перепроектировать данные.
12 фев 13, 10:41    [13912368]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
declare @f table(id1 int, id2 int, primary key (id1, id2));

insert into @f
values
 (1, 2), (2, 1), (1, 3), (3, 1), (2, 3), (3, 2), (3, 4), (4, 3), (4, 5), (5, 4);

insert into @f
select distinct
  a.id1, c.id1
from
 @f a join
 @f b on b.id1 = a.id2 join
 @f c on c.id1 = b.id2
where
 a.id1 <> c.id1 and
 not exists(select 1 from @f where id1 = a.id1 and id2 = c.id1);

select * from @f;
12 фев 13, 10:47    [13912404]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
aleks2
Guest
invm
declare @f table(id1 int, id2 int, primary key (id1, id2));

insert into @f
values
 (1, 2), (2, 1), (1, 3), (3, 1), (2, 3), (3, 2), (3, 4), (4, 3), (4, 5), (5, 4);

insert into @f
select distinct
  a.id1, c.id1
from
 @f a join
 @f b on b.id1 = a.id2 join
 @f c on c.id1 = b.id2
where
 a.id1 <> c.id1 and
 not exists(select 1 from @f where id1 = a.id1 and id2 = c.id1);

select * from @f;

И куда тя понесло то на дальних родственникофф?
@f a join
@f b on b.id1 = a.id2 join
@f c on c.id1 = b.id2
Там не пары, тама штуки
"A is friends with B, and B is friends with C, add a new friendship for the pair A and C."
12 фев 13, 10:55    [13912474]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
aleks2
Guest
Если там действительно гарантируется наличие симметричных пар друганофф
declare @f table(id1 int, id2 int, primary key (id1, id2));

insert into @f
values
 (1, 2), (2, 1), (1, 3), (3, 1), (2, 3), (3, 2), (3, 4), (4, 3), (4, 5), (5, 4);

insert into @f
select a.id1, b.id2 from @f a join @f b on b.id1 = a.id2 where  a.id1 <> b.id2
except 
select * from @f ;

select * from @f;
12 фев 13, 11:01    [13912517]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
leapold
Member

Откуда:
Сообщений: 64
Спасибо.
Самое обидное что
select A.id1, b.id2
from Friend a join Friend b on b.id1 = a.id2 where a.id1 <> b.id2

я написал и сам а вот про except я недодумал
12 фев 13, 11:21    [13912641]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34657
leapold
Highschooler ( ID, name, grade )
English: There is a high school student with unique ID and a given first name in a certain grade.

Friend ( ID1, ID2 )
English: The student with ID1 is friends with the student with ID2. Friendship is mutual, so if (123, 456) is in the Friend table, so is (456, 123).

For all cases where A is friends with B, and B is friends with C, add a new friendship for the pair A and C. Do not add duplicate friendships, friendships that already exist, or friendships with oneself.



insert into Friend (ID1, ID2)
select distinct a.ID1, c.ID2
from Friend a
join Friend c on a.ID2 = c.ID1
where not exists ( select * from Friend ex 
                         where ex.ID1 = a.ID1 and ex.ID2 = c.ID2 )
     and a.ID1 <> c.ID2
12 фев 13, 12:53    [13913322]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34657
invm
declare @f table(id1 int, id2 int, primary key (id1, id2));

insert into @f
values
 (1, 2), (2, 1), (1, 3), (3, 1), (2, 3), (3, 2), (3, 4), (4, 3), (4, 5), (5, 4);

insert into @f
select distinct
  a.id1, c.id1
from
 @f a join
 @f b on b.id1 = a.id2 join
 @f c on c.id1 = b.id2
where
 a.id1 <> c.id1 and
 not exists(select 1 from @f where id1 = a.id1 and id2 = c.id1);

select * from @f;


JOIN одной таблицы лишний.
12 фев 13, 12:55    [13913334]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пож как решить такую задачку  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
Задачка отсюда: Introduction to Databases
12 фев 13, 18:40    [13916038]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить