親子関係を定義したテーブルがあります。
例) テーブル名:TEST_TABLE
code_id , 親code_id ,code_info
000 null null
001 000 AAAA
002 001 BBBB
003 000 CCCC
004 001 DDDD
005 002 DDDD
006 002 DDDD
007 006 DDDD
最初のCODE_IDの値 002を指定した場合に
配下のレコードをセレクトするSQLを
教えてください。
002 001 BBBB
005 002 DDDD
006 002 DDDD
007 006 DDDD
の値が取得できれば正解です。
楽天が運営するポータルサイト : 【インフォシーク】Infoseek
すみません、質問の意図を読みきれて、なかったら、すみません。
SELECT * FROM TEST_TABLE WHERE code_id = 002 OR 親code_id = 002;
これでだけの話では、ないのです?
urlダミーです
001
└002
├005
└006
└007
おそらくこんなツリーを取得したいのではと推測しますが
(それともポインタを使ったリスト構造でしょうか)
それでしたらSQLだけではなくプログラム言語(PHP、VB やストアド)と併用で構築した方がスマートかと(再帰処理)・・
一発のSQLではおそらくこの結果は取得できないのではないかと思いますが・・
階層に制限があるかないかでも違いますし。
SQLのみはメンテナンス性に欠くような気がしますので
ストアド化するうってつけのような処理だと思います
[参考:再帰処理]
プロシージャA(階層n) {
階層n番目のデータ取得処理{
SQL文発行・・・
階層n表示処理・・・
プロシージャA(階層n+1)をコール・・
}
}
Yahoo! JAPAN
標準的なSQLには再帰的な構造を扱うことができませんので、普通のSELECT文でこのような結果を得る事は出来ません。
どうしてもということであればストアドプロシージャを使用することになります。
一時テーブルを合わせて使用すると実装が簡単になります。
具体的なコードは処理系依存になってしまうのでこれだけの情報ではお答えできません。
Yahoo! JAPAN
これでいかがでしょうか?
SELECT * FROM TEST_TABLE
WHERE
code_id = ’002’
AND code_id = 親code_id
#URLは、ダミーです。
え! これだけで再帰的にとれますか?
livedoor
select * from TEST_TABLE
where
code_id = ’002’
or 親code_id = ’002’
or 親code_id in (select code_id from TEST_TABLE where 親code_id=’002)
こんなのでどうでしょうか?
008 007 DDDD
なんてのがあったとしたらこれも対象になるんですかね?
なりますねえ
経理初心者おたすけ帳 - 経理・労務・総務の助け合いサイト
親子の関係が何階層までか制限できればビューとか組んで出来そうな気がするのですが。
何階層までがんばらせますか?
何階層か制限できないようでしたら動的に一時テーブルを作るような処理をかませないと難しいと思います。
達人サンたちの回答を楽しみにしています。
SQLだけでは無理でしか〜残念です