2015 05 24

cross join

先々月、 連番をどう作るか を考えている過程で、0〜9の数字を定数マスターにでも登録しておけばと考えて、でもこれだけじゃ中途半端だとすぐに却下したのだが、ちょっと工夫すればこれだけでも色々な連番が作り出せることに、今更だけど気がついた。

例えば、定数テーブル constants に

key value
number 0
number 1
number 9

と0〜9が登録されているとする。 このとき、次のSQLで0〜99が取り出せる。

select d10.value + d1.value from ( select value * 10 value from constants where key = 'number' ) d10 cross join ( select value from constants where key = 'number' ) d1

0〜999ならこんな感じ。

select d100.value + d10.value + d1.value from ( select value * 100 value from constants where key = 'number' ) d100 cross join ( select value * 10 value from constants where key = 'number' ) d10 cross join ( select value from constants where key = 'number' ) d1

必要な桁の数だけ結合を追加してやれば、いくらでも連番が作り出せる。 まあ、出来るってだけの話なんだけどさ。

inner join や left outer join はよく使うけど、 cross join って使わないよなぁ… と、普段は存在すら忘れている cross join の使い道を考えていて連番の生成を思いついたのだが、これもやっぱり使わないよな。 階層問い合わせが使えない環境ならこんなことをするのかもしれないが、階層問い合わせが使えるのなら、0〜999も

select level - 1 from dual connect by level <= 1000

と1行で取得できるのだ。 誰だってこっちを使うだろう。

そんなことを考えながら歩く浅川の土手。 ふと思い立って、足元にあった石を川に向かって投げてみたら、石は予想を遥かに下回って飛ばず、しかも一撃で肩が痛くなった。

「駄目じゃのう。 半分もいかんじゃないか」

高校時代に野球部でピッチャーをやっていた父は、そう言って笑っていたが、自分も石を拾って投げたら俺の半分も届かず、しかも俺同様にちょっと肩が痛くなったようで、地味に落ち込んでいた。

その後、二人して軽く肩や肘を回し、ゆっくりした動きでフォームを確認し、それからさらに数回石を投げてオーバースローよりもサイドスローの方が負担が少ないことを発見し、最初よりは遠くに投げられるようになって帰ってきた。

「野球のボールだったら、もっと投げられるでしょ。 指がちゃんとかかるから。 変な形の小石だから駄目なんじゃない?」

「ああ、そうか。 それで飛ばんのか。 確かに、野球のボールとはだいぶ感覚が違いよるからの」

なんて言いながら。

並天道虫

並天道虫(ナミテントウ)

こいつら、模様のバリエーションがやたら豊富なんだよな。 俺の中では、この黒地に赤い点が2つのやつがスタンダードなのだが、点の数も様々だし、地と斑が逆転して一見ナナホシテントウみたいなのもいる。

天道虫は自分たちの模様のバリエーションをどう思っているのだろうか。

電線

これは正しい状態なんだろうか。

夕焼けの1

夕焼け。