OraQA

Oracle Question and Answer

  • Do you have a solution to a problem? Do you have an unanswered question? Login and share it with the Oracle community. More...

Oracle News


Entries RSS feed

Comments RSS feed

How to solve the blank SUDOKU grid puzzle by using SQL

October 23rd, 2007 By Frank Zhou

The following SQL pattern can be used to solve the blank SUDOKU grid in a single SQL statement.

SELECT
CASE WHEN ROWNUM IN (3, 6)
     THEN substr(fin_str,1,3)||' | '||substr(fin_str,4,3)
          ||' | '||substr(fin_str,7,3) ||chr(10)||'----------------'
     ELSE substr(fin_str,1,3)||' | '||substr(fin_str,4,3)
          ||' | '||substr(fin_str,7,3)
END sudoku
FROM
(SELECT substr(fin_str,(LEVEL - 1) * 9 + 1, 9) as fin_str
  FROM
 (SELECT fin_str
  FROM
 (SELECT fin_str FROM dual
  MODEL
  DIMENSION BY (0 i )
  MEASURES (CAST(NULL AS NUMBER) num,  CAST(NULL AS NUMBER) tmp,
            CAST(NULL AS NUMBER) fin , CAST(NULL AS NUMBER) tmp_fin,
     CAST(NULL AS varchar2(4000)) str,
            CAST(NULL AS varchar2(4000)) fin_str)
  RULES ITERATE (81)
  (num[ITERATION_NUMBER] = 1,
   tmp_fin[ANY] = mod(nvl(fin[cv()-1], 0), 9) + 1,
   str[ANY] = str[cv()-1] || to_char(tmp_fin[cv()]),
   fin[ANY] = nvl(fin [cv()-1], 0) + num[cv()] + nvl(tmp[cv()], 0),
   tmp[ANY] = CASE WHEN cv(i)+1 IN (9,18,36,45,63,72)
     THEN  3
     WHEN cv(i)+1 IN (27,54,81)
            THEN  4 END,
   fin_str[ANY] = CASE WHEN str[cv() + 1] IS NULL
                       THEN str[cv()] END
  )
 )
WHERE fin_str IS NOT NULL
)
CONNECT BY LEVEL <10
);

SUDOKU
----------------
123 | 456 | 789
456 | 789 | 123
789 | 123 | 456
----------------
234 | 567 | 891
567 | 891 | 234
891 | 234 | 567
----------------
345 | 678 | 912
678 | 912 | 345
912 | 345 | 678                                                                

9 rows selected.

Elapsed: 00:00:00.09

Leave a Reply

You must be logged in to post a comment.

RSS feed for comments on this question