ツリー構造のテーブルにSQLって書けるのか?
という事を調べてみた。
1.SQL99からあるらしい。
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1b.html
↓↓↓↓ こんな書き方だそうな ↓↓↓↓↓
WITH RECURSIVE 中間表(親品番, 子品番, 所要数) AS
( SELECT PP.親品番, PP.子品番, PP.所要数 FROM 部品構成表 PP
WHERE PP.親品番=’自転車’
UNION ALL
SELECT PP.親品番, PP.子品番, PP.所要数*中間表.所要数
FROM 中間部品表, 部品構成表 pp
WHERE pp.親品番=中間表.子品番
)
SELECT 親品番, 子品番, 所要数
FROM 中間表;
↑↑↑↑↑ こんな書き方だそうな ↑↑↑↑↑
※中間表が、再帰呼び出しされている点がミソ。
2.SQLServerは、2005から実装されるらしい。
http://www.microsoft.com/japan/msdn/sqlserver/dnsql90/sql_YukonTSQLEnhance.
asp
↓↓↓↓ こんな書き方だそうな ↓↓↓↓↓
WITH EmpCTE(empid, empname, mgrid, lvl)
AS
(
– Anchor Member (AM)
SELECT empid, empname, mgrid, 0
FROM Employees
WHERE empid = 7
UNION ALL
– Recursive Member (RM)
SELECT E.empid, E.empname, E.mgrid, M.lvl+1
FROM Employees AS E
JOIN EmpCTE AS M
ON E.mgrid = M.empid
)
SELECT * FROM EmpCTE
↑↑↑↑↑ こんな書き方だそうな ↑↑↑↑↑
※EmpCTEが、再帰呼び出しされている点がミソ。
※SQLServer2000だと無理なので、ファンクションの
再帰呼び出しで書いてみた所、動いたが
デバッグとか循環参照チェックとか面倒。。
3.Oracleでは、「SQLリファレンス」の”階層問合せ”で実装できるそうな。
↓↓↓↓ こんな書き方だそうな ↓↓↓↓↓
select *
from TABLE
start with currentKey=’key1′
connect by prior childKey = currentKey
↑↑↑↑↑ こんな書き方だそうな ↑↑↑↑↑
※最後の2行がミソ
4.結果
今回は、OracleとSQLServer両対応したかったので、
使うのを止めた。プログラム側で対応。。
SQLServer2005が前提ならば使ったかも。。
関連記事
- XCOPY(良く使うパターン)
- CLOBデータをSQLPLUS上に表示するには
- coldfusion server ServiceFactory
- CFでミリ秒単位の計測
- DHTML(JScript)のチューニング覚え書き。
- SQLによるXMLの読み込み方法
- EmptyとNull
- ORACLE、SQLServerの相違点というか。。
- DHTML ウィンドウ間のアクセス
- ブログに参照ページのタイトルとURLをWindowsのクリップボードへ貼り付けるブックマークレット
- IE8で追加されたCSS(styleオブジェクトの新プロパティ16個)
- Encode比較ツール Part.1:escape , encodeURI , encodeURIComponent関数
- マウスカーソル位置の色情報取得ブックマークレット:Google AdSenseやAmazonアソシエイト等での色設定に苦労していませんか? Part.2
- マウスカーソル位置のサイズ情報取得ブックマークレット:Google AdSenseやAmazonアソシエイト等での色・サイズ設定に苦労していませんか? Part.3
- マウスカーソル位置のサイズ情報取得IE右クリック拡張・ブックマークレット:Google AdSenseやAmazonアソシエイト等での色・サイズ設定に苦労していませんか? Part.4
