powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / пятничная задачка (про) коня
18 сообщений из 118, страница 5 из 5
пятничная задачка (про) коня
    #38006184
collow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
with
  d as ( select level n from dual connect by level <= 8 )
, c as ( select x.n x, y.n y from d x, d y )
, s as (
    select  1 x,  2 y from dual union all
    select  2 x,  1 y from dual union all
    select -1 x,  2 y from dual union all
    select -2 x,  1 y from dual union all
    select  1 x, -2 y from dual union all
    select  2 x, -1 y from dual union all
    select -1 x, -2 y from dual union all
    select -2 x, -1 y from dual
  )
, p as (
    select c.x        x0
         , c.y        y0
         , c.x + s.x  x1
         , c.y + s.y  y1
      from c, s
     where c.x + s.x between 1 and 8
       and c.y + s.y between 1 and 8
  )
select level lev
     , sys_connect_by_path( p.x1 || p.y1, ',' ) route
  from p
 where level = 63
 start with p.x0 = 1 and p.y0 = 1
 connect by nocycle p.x0 = prior p.x1 and p.y0 = prior p.y1 and not ( p.x1 = 1 and p.y1 = 1 )


Написал тупо в лоб минут за 15. ОКончания работы пока не дождался. Тему не читал :)
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38006223
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
collow..
Написал тупо в лоб минут за 15. ОКончания работы пока не дождался. Тему не читал :)
(имхо) ну и напрасно .
совершенно не обязательно прыгать на грабли, которые уже известны всем.
(и особенно больно, если прыгать с 64-го этажа)
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38006261
collow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я как бы ни на что и не претендую.
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38006272
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
collow,

Просто решил продемонстрировать свою туполобость?
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38006286
collow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не, просто зацепил начальный пост о невозможности сделать это на чистом скл и тем более полный перебор. В этом плане да, решил немного выпендриться. Бывает. На самом деле если бы я сразу обратил внимание на дату начального поста, не стал бы вообще заморачиваться.
Ну а теперь можно и развитие сюжета почитать.
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38161560
init.ora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решал относительно недавно эту задачу на MSSQL с помощью рекурсивного CTE (решение очень похоже на это пятничная задачка (про) коня )

сейчас для закрепления материала начал решать ее под оракл тем же методом.

каково же было мое удивление, когда я понял, что нельзя использовать конструкции такого вида
:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with x (a)  as(
select 1 a from dual
union all
select a
from(
	select  a+1 a
	from x where a<64
)z
)
select * from x



если бы не трюк с MAX(Ss.Id_to1) KEEP (DENSE_RANK FIRST ORDER BY COUNT(*)) , подсмотренный у andreymx , наверно не обошелся бы без Pl\sql.
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38161620
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
init.oraкаково же было мое удивлениеRSFC (recursive subquery factoring clause) вообще сильно отстает от CTE: 11020487 .
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38161971
init.ora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopinit.oraкаково же было мое удивлениеRSFC (recursive subquery factoring clause) вообще сильно отстает от CTE: 11020487 .

Зато в RSFC можно писать в рекурсивной части
Код: plsql
1.
2.
3.
4.
5.
6.
with x as(
..
union all
select (select min\max from ....)
from x
)



что довольно неплохо.
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38162075
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
init.oraРешал относительно недавно эту задачу на MSSQL с помощью рекурсивного CTE (решение очень похоже на это пятничная задачка (про) коня )

сейчас для закрепления материала начал решать ее под оракл тем же методом.

каково же было мое удивление, когда я понял, что нельзя использовать конструкции такого вида
:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with x (a)  as(
select 1 a from dual
union all
select a
from(
	select  a+1 a
	from x where a<64
)z
)
select * from x



если бы не трюк с MAX(Ss.Id_to1) KEEP (DENSE_RANK FIRST ORDER BY COUNT(*)) , подсмотренный у andreymx , наверно не обошелся бы без Pl\sql.
пример (как мне видится) сути вашей проблемы не отображает, ибо, чтобы заработал, достаточно выполнить то, что говорит вам
ORA-32042: рекурсивная фраза WITH должна напрямую ссылаться на себя в одной из ветвей UNION ALL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with x (a)  as(
select 1 a from dual
union all
-- select a
-- from(
	select  a+1 a
	from x where a<64
-- )z
)
select * from x;
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38162145
init.ora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orawishinit.oraРешал относительно недавно эту задачу на MSSQL с помощью рекурсивного CTE (решение очень похоже на это пятничная задачка (про) коня )

сейчас для закрепления материала начал решать ее под оракл тем же методом.

каково же было мое удивление, когда я понял, что нельзя использовать конструкции такого вида
:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with x (a)  as(
select 1 a from dual
union all
select a
from(
	select  a+1 a
	from x where a<64
)z
)
select * from x



если бы не трюк с MAX(Ss.Id_to1) KEEP (DENSE_RANK FIRST ORDER BY COUNT(*)) , подсмотренный у andreymx , наверно не обошелся бы без Pl\sql.
пример (как мне видится) сути вашей проблемы не отображает, ибо, чтобы заработал, достаточно выполнить то, что говорит вам
ORA-32042: рекурсивная фраза WITH должна напрямую ссылаться на себя в одной из ветвей UNION ALL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with x (a)  as(
select 1 a from dual
union all
-- select a
-- from(
	select  a+1 a
	from x where a<64
-- )z
)
select * from x;



Понятное дело!
пример, который я привел сильно упрощен, чтобы показать суть проблемы с которой я столкнулся.
В подзапросе хотел использовать Row_number(), вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
...
Union all
select ....
from(
select row_number()over(order by ..) r
from ttt
)z where r=1
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38162163
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
init.oraВ подзапросе хотел использовать Row_number(), вот таккак ты себе представляешь рекрсию по условию над результатами рекурсии. Если предполагаешь сначала сформировать набор, потом фильтровать, так и делай.
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38162301
init.ora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-init.oraВ подзапросе хотел использовать Row_number(), вот таккак ты себе представляешь рекрсию по условию над результатами рекурсии. Если предполагаешь сначала сформировать набор, потом фильтровать, так и делай.

нет, нет.. никакой рекурсии над рекурсией.

хотелось бы сначала отфильтровать записи в зависимости от рекурсивного члена,
затем применить ROW_NUMBER, затем отфильтровать по нему.

в частности решение andreymx (точнее, последнюю его часть)
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT      MAX(Ss.Id_to1) KEEP (DENSE_RANK FIRST ORDER BY COUNT(*))
     FROM Ss
    WHERE Ss.Id_from = T.Id_new
      AND T.ID || Id_new || ',' NOT LIKE '%,' || Ss.Id_to1 || ',%'
      AND (T.ID || Id_new || ',' NOT LIKE '%,' || Ss.Id_to2 || ',%' OR l = 63)
 GROUP BY Ss.Id_to1



я хотел (точнее не хотел, а не знал что можно так использовать MAX(Ss.Id_to1) KEEP (DENSE_RANK FIRST ORDER BY COUNT(*)) ) бы переписать таким образом( в MSSQL это возможно)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select cnt ...
from(
 select cnt,row_number()over(order by cnt) r
 from(
	 select count(Ss.Id_to1)over(partititon by S1.Id_from) cnt 
	 from ss
	 WHERE Ss.Id_from = T.Id_new
	 AND T.ID || Id_new || ',' NOT LIKE '%,' || Ss.Id_to1 || ',%'
	 AND (T.ID || Id_new || ',' NOT LIKE '%,' || Ss.Id_to2 || ',%' OR l = 63)
 )z
)z where r=1
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38174033
andreymxобычным SQL за 0.2 сек на Оракл 9.2? это реально :-)А можно два слова о подходе?
И что означают колонки и цифры в таблице ss?
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38174177
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарный читательandreymxобычным SQL за 0.2 сек на Оракл 9.2? это реально :-)А можно два слова о подходе?
И что означают колонки и цифры в таблице ss?да там вроде всё понятно - что за подход
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #38174338
andreymxБлагодарный читательпропущено...
А можно два слова о подходе?
И что означают колонки и цифры в таблице ss?да там вроде всё понятно - что за подход

Он оказался слишком гениален для меня.
Так же как и число строк - 2008 в ss.
В чем идея?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
пятничная задачка (про) коня
    #39942102
Jack963
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop, Здравствуйте, а вы можете объяснить решение, пожалуйтста. Например, комментариями, не совсем понимаю, что происходит в каждой строке.
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #39942133
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jack963
dbms_photoshop, Здравствуйте, а вы можете объяснить решение, пожалуйтста. Например, комментариями, не совсем понимаю, что происходит в каждой строке.
В мире есть 10 типов людей: которые понимают двоичную арифметику и которые нет.
Смирись. Если ты не в состоянии понять что-либо работающее, ты, тем более, не сможешь создать что-нибудь близкое по сложности сам. Ищи другую нишу для трудоустройства.
...
Рейтинг: 0 / 0
пятничная задачка (про) коня
    #39942227
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jack963
dbms_photoshop, Здравствуйте, а вы можете объяснить решение, пожалуйтста. Например, комментариями, не совсем понимаю, что происходит в каждой строке.
Юное дарование, в том сообщении откуда решение было взято также указан используемый метод.
Вместо того, чтоб почитать про метод ты решило избавиться от процедур и функций и сделать решение более сложным для понимания.
Это персональный выбор каждого - включить мозг или заниматься вредительством.
...
Рейтинг: 0 / 0
18 сообщений из 118, страница 5 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / пятничная задачка (про) коня
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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