- ベストアンサー
階層データのあるテーブルで親から最下層の子までのパスを列挙するクエリ
- 最上位の親から最下層の子までのパスを列挙するSQLクエリで親子関係のデータが自動的に作成されるシステムの問題を解決したい。
- テーブル構造は直属の親と子を1レコードで保存しており、最上位の親のIDは0であり、それ以外の親のIDは1以上である。
- 提供されたSQLクエリではパスの列挙はできるが、名前の表示が最上位の親だけであり、クエリの改善方法を求める。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
再帰CTEの話をすると混乱するかもしれませんので、とりあえず以下を。 ただ、クエリを見る限り、Accessっぽいのが気になります。 SELECT CASE WHEN d5.ChildID IS NOT NULL THEN d5.ChildID WHEN d4.ChildID IS NOT NULL THEN d4.ChildID WHEN d3.ChildID IS NOT NULL THEN d3.ChildID WHEN d2.ChildID IS NOT NULL THEN d2.ChildID WHEN d1.ChildID IS NOT NULL THEN d1.ChildID END, CASE WHEN d5.ChildID IS NOT NULL THEN d4.ChildID WHEN d4.ChildID IS NOT NULL THEN d3.ChildID WHEN d3.ChildID IS NOT NULL THEN d2.ChildID WHEN d2.ChildID IS NOT NULL THEN d1.ChildID END, CASE WHEN d5.ChildID IS NOT NULL THEN d3.ChildID WHEN d4.ChildID IS NOT NULL THEN d2.ChildID WHEN d3.ChildID IS NOT NULL THEN d1.ChildID END, CASE WHEN d5.ChildID IS NOT NULL THEN d2.ChildID WHEN d4.ChildID IS NOT NULL THEN d1.ChildID END, CASE WHEN d5.ChildID IS NOT NULL THEN d1.ChildID END, COALESCE(d1.ChildName,d2.ChildName,d3.ChildName,d4.ChildName,d5.ChildName) FROM Department d1 LEFT OUTER JOIN Department d2 ON d2.ChildID=d1.ParentID LEFT OUTER JOIN Department d3 ON d3.ChildID=d2.ParentID LEFT OUTER JOIN Department d4 ON d4.ChildID=d3.ParentID LEFT OUTER JOIN Department d5 ON d5.ChildID=d4.ParentID
お礼
おお!いとも簡単に・・・ まだまだ勉強不足を痛感しています。こんな方法もあるんですね・・・ 教えていただいて本当にありがとうございます。 ちなみに、Accessっぽいのは、もともとAccessから勉強しだした人間なので、 基礎が抜けきらない状態です。 SQLServer2000を手にしてSQL文を勉強しだしたので、初心者に近いです。・・・ 再帰CTEなどの例文をいろいろやっていきま=す。