powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помоги решить такую интересную задачу
19 сообщений из 19, страница 1 из 1
Помоги решить такую интересную задачу
    #39559164
Mr.Brown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно найти круг друзей , друг моего друга

Пример таблицы указан ниже,
Нужно найти круги друзей в которых есть общие друзья

СТОРОНА 1 | ДРУЗЬЯ........ |СТОРОНА 1 | ДРУЗЬЯ
______________________________________________________
КРУГ 1........| Борис,Артем | Круг 2......| Виктор,Артем
______________________________________________________
КРУГ 3........| Денис,Евгений | Круг 4......| Владимир,Станислав
______________________________________________________
КРУГ 2........| Виктор,Артем | Круг 5........|Андрей,Виктор

Как видно , из Круга 1 Артем есть в Круге 2
И при этом из Круга 2 Виктор есть в Круге 5 .

Т.е общие друзья Между кругом 1 и кругом 2 через Артема, и Кругом 2 и Кругом 5 через Виктора.
Соответственно Круги 1, Круг 2 и Круг 5 имеют общий друзей.

Нужно написать такой селект чтобы вывести такие круги друзей, и учитывать что имена друзей разделены запятой
Надеюсь смог объяснить
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559166
Mr.Brown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу не обращать внимание на скриншот он не правильный, вот исправленный вариант
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559168
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В проктостоматологии на криво спроектированной БД нет ничего интересного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559171
Mr.Brown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Тоесть ?
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559172
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.BrownТоесть ?

Доведи базу до третьей нормальной формы и твой запрос станет тривиальным WITH
RECURSIVE/CONNECT BY.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559178
Mr.Brown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Прошу помочь, каким образом мне преобразовать мои данные в 3nf.
как он примерно должен выглядеть
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559186
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.BrownПрошу помочь, каким образом мне преобразовать мои данные в 3nf.
как он примерно должен выглядеть

Берёшь свой скриншотик, распечатываешь на бумаге.
У тебя 3 вертикальных полоски на напечатанном.
Берёшь ножницы и разрезаешь листик по средней вертикальной полоске.
Берёшь часть, где у тебя "сторона 2", и по первой сверху горизонтальной полоске отрезаешь.
Часть, где "Сторона 2", выкидываешь.
Молишься.
Оставшийся кусочек подклеиваешь снизу к части со "стороной 1", чтобы круги были под кругами, а друзья под друзьями.
Вуаля - ты сделяль!
Вот так примерно и должен выглядеть "он".
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559190
Mr.Brown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FogelMr.BrownПрошу помочь, каким образом мне преобразовать мои данные в 3nf.
как он примерно должен выглядеть

Берёшь свой скриншотик, распечатываешь на бумаге.
У тебя 3 вертикальных полоски на напечатанном.
Берёшь ножницы и разрезаешь листик по средней вертикальной полоске.
Берёшь часть, где у тебя "сторона 2", и по первой сверху горизонтальной полоске отрезаешь.
Часть, где "Сторона 2", выкидываешь.
Молишься.
Оставшийся кусочек подклеиваешь снизу к части со "стороной 1", чтобы круги были под кругами, а друзья под друзьями.
Вуаля - ты сделяль!
Вот так примерно и должен выглядеть "он".

Спасибо за юмор )
Это да, разобрался)) но как сохранить взаимосвязь между кругами?
В плане того что они имели связь между собой.
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559216
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.BrownСпасибо за юмор )
Это да, разобрался)) но как сохранить взаимосвязь между кругами?
В плане того что они имели связь между собой.

Это была сатира.

Используй силу Люк базу данных.
Вот база данных, которую использует Mr.Brown.
А вот таблица, которая в базе хранится, которую использует Mr.Brown.
А вот данные из скриншота, которые хранятся в таблице, которая в базе хранится, которую использует Mr.Brown.
А вот команда select, которая тянет данные, что на скриншоте, но из таблицы, которая в базе хранится, которую использует Mr.Brown.
А вот функция substr, которая выделяет друзей из кругов, которые выданы командой select, которая тянет данные, что на скриншоте, но из таблицы, которая в базе хранится, которую использует Mr.Brown.
А вот условие connect by, которое устанавливает связи друзей по кругам, которые получены функцией substr, которая выделяет друзей из кругов, которые выданы командой select, которая тянет данные, что на скриншоте, но из таблицы, которая в базе хранится, которую использует Mr.Brown.
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559239
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.BrownFogel...
Оставшийся кусочек подклеиваешь снизу к части со "стороной 1", чтобы круги были под кругами, а друзья под друзьями.
Вуаля - ты сделяль!
Вот так примерно и должен выглядеть "он".
Это да, разобрался))

По ходу Fogel тоже не особо разобрался что есть 3nf...
То, что продемонстрировано, не является даже 1nf
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559271
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousMr.Brownпропущено...

Это да, разобрался))

По ходу Fogel тоже не особо разобрался что есть 3nf...
То, что продемонстрировано, не является даже 1nf
Fogel - не читатель, Fogel - писатель.
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559286
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Mr.Brown,

connected components: quick find quick union algorithm
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
declare
   type char_array   is table of varchar2(20) index by varchar2(20);
   type arr_elems    is table of sys.ku$_vcnt index by varchar2(20);
   root              char_array;
   root_elems        arr_elems;

   n        varchar2(20);

    l integer:=dbms_utility.get_time();

    procedure print(v in varchar2) is
    begin
      dbms_output.put_line(to_char((dbms_utility.get_time-l)/100,'0999.99')||' '||v);
      l:=dbms_utility.get_time();
    end;

   
   function get_root(n varchar2) return varchar2 is
   begin
      if root.exists(n) then 
         return root(n);
      else 
         return null;
      end if;
   end;
   
   procedure update_root(old_root varchar2,new_root varchar2) is
      i pls_integer;
   begin
      if old_root!=new_root then 
         root_elems(new_root):=root_elems(new_root) multiset union all root_elems(old_root);
         for i in 1..root_elems(old_root).count
         loop
            root(root_elems(old_root)(i)):=new_root;
         end loop;
         root_elems(old_root).delete;
       end if;
   end;
   
   procedure add_elem(p_root varchar2, p_elem varchar2) is
   begin
      if not root_elems.exists(p_root) then
         root_elems(p_root):=sys.ku$_vcnt(p_elem);
      else
         root_elems(p_root).extend();
         root_elems(p_root)(root_elems(p_root).count):=p_elem;
      end if;
   end;
   
   procedure add_link(p varchar2,q varchar2) is
      r1       varchar2(20);
      r2       varchar2(20);
      new_root varchar2(20);
   begin
      r1:=get_root(p);
      r2:=get_root(q);
      
      if r1 is null or r2 is null then
         new_root := coalesce(r1,r2,p);
         if r1 is null then add_elem(new_root,p); root(p):=new_root; end if;
         if r2 is null then add_elem(new_root,q); root(q):=new_root; end if;
      else
         new_root:=least(r1,r2);
         root(p) :=new_root;
         root(q) :=new_root;
         update_root(greatest(r1,r2),new_root);
      end if;
      
   end;

begin
   print('start');
   for r in (
            with v(p,q) as (
              select 'Круг 1', 'Борис'     from dual union all
              select 'Круг 1', 'Артем'     from dual union all
              select 'Круг 3', 'Денис'     from dual union all
              select 'Круг 3', 'Евгений'   from dual union all
              select 'Круг 2', 'Виктор'    from dual union all
              select 'Круг 2', 'Артем'     from dual union all
              select 'Круг 4', 'Владимир'  from dual union all
              select 'Круг 4', 'Станислав' from dual union all
              select 'Круг 1', 'Андрей'    from dual union all
              select 'Круг 1', 'Виктор'    from dual
            )
            select *
            from v
   )
   loop
      add_link(r.p, r.q);
   end loop;
   print('processed');
   print('groups:');
   
   n:= root_elems.first();
   while n is not null loop
      for i in 1..root_elems(n).count loop
         dbms_output.put(','||root_elems(n)(i));
      end loop;
      dbms_output.put_line(' ');
      n:=root_elems.next(n);
   end loop;
end;


в выделенном подставляешь свой запрос с данными
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559290
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
xtender,

Там надо пару строчек закомментировать, чтобы в элементы группы не попадал рут
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559295
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderMr.Brown,
..
в выделенном подставляешь свой запрос с данными
Сначала красные прогнали белых из леса, потом белые прогнали красных из леса.
Потом пришёл лесник и всех выгнал )))
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559301
Mr.Brown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

Спасибо!

на чистом SQL возможно решить?
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559305
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559310
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Mr.Brown,

решение Elic'a
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with test(clientid,accountid) as (
  select 'Круг 1', 'Борис'     from dual union all
  select 'Круг 1', 'Артем'     from dual union all
  select 'Круг 3', 'Денис'     from dual union all
  select 'Круг 3', 'Евгений'   from dual union all
  select 'Круг 2', 'Виктор'    from dual union all
  select 'Круг 2', 'Артем'     from dual union all
  select 'Круг 4', 'Владимир'  from dual union all
  select 'Круг 4', 'Станислав' from dual union all
  select 'Круг 1', 'Андрей'    from dual union all
  select 'Круг 1', 'Виктор'    from dual
)
select max(group_member_id) as group_max_id, clientid, accountid
  from
  ( select                 clientid  as group_member_id
         , connect_by_root accountid as accountid
         , connect_by_root clientid  as clientid
      from test
      connect by nocycle decode(accountid, prior accountid, 1, 0)
                       + decode(clientid,  prior clientid,  1, 0)
                       = 1
  )
  group by accountid, clientid
  order by group_max_id, clientid, accountid
;
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559729
Mr.Brown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за решение, как при этом в вытащить то что в Базе храниться в этом виде
КРУГ 1| Борис,Артем
...
Рейтинг: 0 / 0
Помоги решить такую интересную задачу
    #39559741
да ещё и ложками.
да что уж там ложками - поварёшками!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помоги решить такую интересную задачу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]