Ciekawostka – Recursive Subquery Factoring

Posted: 02/11/2009 in Info, Oracle
Tags: ,

Właśnie znalazłem w necie bardzo ciekawy przykład zastosowania nowego dodatku jakim jest Recursive Subquery Factoring. Narzędzie to znajduje się w bazie Oracle 11g (wydanie drugie).

Załóżmy, że mamy taka planszę Sudoku:

sudoku

Aby je rozwiązać musimy z tej planszy utworzyć string. Będzie on miał postać:
„53 7 6 195 98 6 8 6 34 8 3 17 2 6 6 28 419 5 8 79”

Teraz wystarczy umieścić powyższy string w Recursive Subquery Factoring, a zapytanie zwróci nam wynik rozwiązania naszego Sudoku.

with x( s, ind ) as
( select sud, instr( sud, ‚ ‚ )
  from ( select ’53 7 6 195 98 6 8 6 34 8 3 17 2 6 6 28 419 5 8 79’ sud from dual )
  union all
  select substr( s, 1, ind – 1 ) || z || substr( s, ind + 1 )
          , instr( s, ‚ ‚, ind + 1 )
  from x
          , ( select to_char( rownum ) z
             from dual
             connect by rownum <= 9
           ) z
  where ind > 0
  and not exists ( select null
                          from ( select rownum lp
                                   from dual
                                   connect by rownum <= 9
                                   )
                          where z = substr( s, trunc( ( ind – 1 ) / 9 ) * 9 + lp, 1 )
                          or        z = substr( s, mod( ind – 1, 9 ) – 8 + lp * 9, 1 )
                          or        z = substr( s, mod( trunc( ( ind – 1 ) / 3 ), 3 ) * 3
                                                      +trunc( ( ind – 1 ) / 27 ) * 27 + lp
                                                      +trunc( ( lp – 1 ) / 3 ) * 6
                                                   ,1 )
                        )
  )
  select s
  from x
  where ind = 0
  /

Wynikiem zapytania będzie ciąg:
534678912672195348198342567859761423426853791713924856961537284287419635345286179

,który jest rozwiązaniem Sudoku:

sudoku_solution

Trzeba przyznać, że przykład jest świetny🙂

Oryginalny artykuł możecie znaleźć TU.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s