Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
Тестовые задания нужно решать самостоятельно. |
12 фев 13, 00:24 [13911484] Ответить | Цитировать Сообщить модератору |
leapold Member Откуда: Сообщений: 64 |
Уже голову сломал на нем .Весь день хожу вокруг до около |
12 фев 13, 00:27 [13911491] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Ennor Tiegael Member Откуда: Сообщений: 3348 |
Гавриленко Сергей Алексеевич, Прикол декларативных языков в том, что на самом деле написать решение можно :). Другой вопрос, что решение, которое ТС не смог сам написать, он вряд ли сможет понять, не говоря уже о том, чтобы его объяснить другим. Тут-то его за жабры и возьмут ![]() |
12 фев 13, 06:17 [13911696] Ответить | Цитировать Сообщить модератору |
leapold Member Откуда: Сообщений: 64 |
Спасибо за ответ. Решение правильное но очень сложное. Я уверен что можно сделать легче. Сижу копаю дальше |
12 фев 13, 10:13 [13912206] Ответить | Цитировать Сообщить модератору |
Ennor Tiegael Member Откуда: Сообщений: 3348 |
leapold, Решение неправильное, т.к. оно основывается на неправильно понятом условии. aleks2 счел, что зеркальные записи (id2, id1) в таблице Friend отсутствуют, в то время как в условии явно сказано иное:
|
||
12 фев 13, 10:30 [13912306] Ответить | Цитировать Сообщить модератору |
Cygapb-007 Member Откуда: Сообщений: 1677 |
требуется ли по постановке задачи из цепочек (1,2)(2,4)(4,6) и (1,3)(3,5)(5,7) выводить (6,7)? Или только ближайших друзей? |
12 фев 13, 10:40 [13912365] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Копай, копай.
Это просто условие неправильное. Надо перепроектировать данные. |
||||||
12 фев 13, 10:41 [13912368] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
И куда тя понесло то на дальних родственникофф? @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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34657 |
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] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34657 |
JOIN одной таблицы лишний. |
||
12 фев 13, 12:55 [13913334] Ответить | Цитировать Сообщить модератору |
grigrim Member Откуда: Москва Сообщений: 89 |
Задачка отсюда: Introduction to Databases |
12 фев 13, 18:40 [13916038] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |