ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

SQL再帰WITH句の手習いズンドコキヨシ(※元ネタ有り)

懲りずにズンドコキヨシ。
ワイ将、明智重蔵氏 の 下記エントリに衝撃を受ける。彡(゚)(゚)

Oracle再帰With句でズンドコキヨシ
http://qiita.com/AketiJyuuzou/items/c2bc63872125e7277e96

と云う訳(?)で、再帰WITH句の手習いがてら、リファクタリングっぽく似たのを作ってみた。

WITH rec(zundoko) AS (
  SELECT NULL FROM DUAL
   UNION ALL
  SELECT zundoko || MOD(TRUNC(DBMS_RANDOM.VALUE*10), 2)
    FROM REC
   WHERE zundoko IS NULL
      OR zundoko NOT LIKE '%00001'
)
SELECT kiyoshi FROM (
  SELECT REPLACE(REPLACE(zundoko, '0', 'ズン!'), '1', 'ドコ!') || 'キ・ヨ・シ!' AS kiyoshi
    FROM rec
   ORDER BY ROWNUM DESC
 )
 WHERE ROWNUM <= 1
/

結果は以下の通り、なるほどねぇ……彡(-)(-)

SQL> WITH rec(zundoko) AS (
  2    SELECT NULL FROM DUAL
  3     UNION ALL
  4    SELECT zundoko || MOD(TRUNC(DBMS_RANDOM.VALUE*10), 2)
  5      FROM REC
  6     WHERE zundoko IS NULL
  7        OR zundoko NOT LIKE '%00001'
  8  )
  9  SELECT kiyoshi FROM (
 10    SELECT REPLACE(REPLACE(zundoko, '0', 'ズン!'), '1', 'ドコ!') || 'キ・ヨ・シ!' AS kiyoshi
 11      FROM rec
 12     ORDER BY ROWNUM DESC
 13   )
 14   WHERE ROWNUM <= 1
 15  /

KIYOSHI
--------------------------------------------------------------------------------
ズン!ズン!ズン!ドコ!ドコ!ズン!ズン!ドコ!ドコ!ズン!ズン!ドコ!ドコ!ズ
ン!ズン!ズン!ドコ!ズン!ズン!ドコ!ドコ!ドコ!ズン!ドコ!ズン!ズン!ズン
!ドコ!ドコ!ドコ!ドコ!ドコ!ズン!ドコ!ドコ!ズン!ズン!ズン!ドコ!ズン!
ズン!ズン!ズン!ズン!ドコ!キ・ヨ・シ!

以前の旅人算もそうなんですが、
氏の記事は実にエッジが効いていて参考になります(`・ω・)ゞ

Oracle ACE 山岸賢治氏
http://www.oracle.com/technetwork/jp/database/articles/vivadeveloper/index-1838333-ja.html
US-OTNでは「Aketi Jyuuzou」、OTN-Japanのフォーラムでは「明智重蔵」のハンドルネームで活躍中。
「Oracle SQLパズル」を運営。
第1部 再帰with句の使用例
http://www.oracle.com/technetwork/jp/articles/otnj-sql-image7-1525406-ja.html#a
10-349 旅人算メソッドで連続日付をグループ化
http://www.geocities.jp/oraclesqlpuzzle/10-349.html

ズンドコキヨシまとめは下記

ズンドコキヨシまとめ
http://qiita.com/shunsugai@github/items/971a15461de29563bf90

Qiitaにも書いたやで彡(゚)(゚)

SQL再帰WITH句の手習いズンドコキヨシ(※元ネタ有り)
http://qiita.com/ora_gonsuke777/items/95b40ca8baa50cb3b875