いわゆる、再帰の例題として扱うに適した材料だったりします。
5代血統からクロスを抽出する作業を頼まれたので、どうやってやろうかなと。
汎用性があって運用的に便利なのは、やはりSQLで書いてしまう方法。
どうせ元々のデータがデータベース上にある訳ですからね。

個人的には今まで、そういった血統データには興味が無かったので、そもそものルールが分からん。
という所からスタート。
ルールさえ分かってしまえば、それをコードに落とす作業はそれほど難しくありません。
だって、そのデータの構造的にSQL文で書ける事は確実なので。
きっとプログラム一般で多分難しいのは、ルールをどう設定するか?なのでしょうね。

パズルを解く感じでなかなか楽しめました。

クロスは血統表上に2つ以上同じ馬が出現している、というのが前提。
それを表現するためには1頭の馬の血統表を2組使います。

手順としては

6代分であれば祖先の126頭分を縦方向に展開。

t1

1番右の項目は、そこに至るまでのキーです。
f(父)m(母)この組み合わせで一意に出現場所を特定出来るようになる。

次に上記のデータを2つ、同じ馬で繋げば重複(つまりクロスの元)が取得出来ます。
このように同じデータの参照が多くなるので、一旦ビューにしてしまった方が楽。
・・・と思ったのが微妙に失敗。
いや、やり方は合っているのですけれども。

今回はSQLServerでの運用だったので、使うツールはSQL Server Mangagement Studioになります。
こいつ、アクセスもそうですがビューとして保存すると中身が良くわからないレイアウトで保存しやがります。
あの汚い書式は何だろう?
SQLサーバーを使う方は少ないかもですが、アクセスであればまだ使用する方もいるかと。
僕はクエリも手書きが基本。
それを保存してしまうと、独自の構文に変換されてしまうのが辛い。
うっかりテキストで残すを忘れた時は本当にイラッとしますよね。

なんだコレ

t2

勝手にこんな形にされてしまう。
読めんわボケ!
僕は結構キレイで読みやすいSQLを書く方なので、これは我慢ならん。
プログラムと違ってSQLだとブレークポイントを設定する事も出来ないし、間違いに気がつけるように見やすい文にするのが基本。
それをツールがぶち壊してどするんだと。
複雑なビューだと、もう手直しするのも心が折れてしまいます。
なので、必ずSQL文自体を残しておくことをお忘れ無く。