- ベストアンサー
抽出結果を1件ずつ次の抽出条件に使う方法
- Oracleで特定の条件でデータを抽出し、別の抽出条件の値として1件ずつ使用してデータを抽出し、件数を取得する方法を調査しています。
- (1)の結果が数百件あるため、ループ処理で(2)を実行したいと思っていますが、PL/SQLの使用方法について困っています。
- 一時的なデータ確認のために専用プログラムを作りたくないため、参考となる情報や(2)のサンプルコードなどを頂けると助かります。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
--TABLE4どぉえぇすぅかぁ(爆 set serveroutput on declare v_count number; begin for v_rec in (select id from TABLE1) loop select count(*) into v_count from TABLE4 where Id in ( select TB4_id from TABLE3 where TB2_id in ( select Id from TABLE2 where TB1_id = v_rec.id)); dbms_output.put_line(v_rec.id || ' ' || v_count); end loop; end; / TABLE3にTB3_idはないので……TB2_idですよね? ちょっと時間がないので、PL/SQLで逃げときます。 SQLの部分を適当にいじってください。 # どなたか……SQLお願いします(笑
その他の回答 (6)
- SherlockHolmes2
- ベストアンサー率40% (175/429)
そんなに難しくないですよ。 select TABLE1.X , (select count(*) from TABLE2 where TABLE2.Z = TABLE1.X) from TABLE1
お礼
ありがとうございます! 自前のPL/SQLの結果がどうも怪しいのでやり直しになりました(^_^;) 教えていただいた方法も参考にしてみたいと思います。 取り急ぎお礼まで。
- root139
- ベストアンサー率60% (488/809)
なるほど、他にも関係するテーブルが有ったのですね。 TABLE1 を全件検索するSQLの SELECT 句のサブクエリにそのSQLをそのまま入れてやればよいのでは? Oracle では試していませんが・・・。 例) ------------------------------------ SELECT Id, ( SELECT COUNT(*) FROM TABLE4 t4 where t4.Id IN ( SELECT TB4_id FROM TABLE3 t3 WHERE t3.TB2_id IN ( SELECT Id FROM TABLE2 t2 WHERE t2.TB1_id = t1.Id ) ) ) AS cnt FROM TABLE1 t1 -- 必要に応じて絞り込む -- WHERE Id IN ('hoge') ;
お礼
ありがとうございます! 試してみたいと思います。 今まで適当にOracle使っていたので、簡単に取得できそうなことに四苦八苦してしまいました。 取り急ぎお礼まで。
- dda167
- ベストアンサー率76% (55/72)
--こういうことだったの?…TABLE3て何だ(笑 select T1.X, count(*) from TABLE1 T1, TABLE2 T2, TABLE3 T3 where T1.X = T3.Y3 and T1.Y = 'test' and T2.Y2 = T3.X3 group by T1.X; 正確な回等が欲しければ正確に質問(できるだけ簡略化して)することです 最初の質問は簡略化したのではなく間違っていただけでしょう? まだ何か隠していませんか? 簡単な例を挙げたほうがいいですね
お礼
ご指摘ありがとうございます。 質問が不正確ですみません。 改めて下記に整理をしてみました。 -------------------------------- ◆テーブル構成 TABLE1:Id TABLE2:Id,TB1_id TABLE3:Id,TB2_id,TB4_id TABLE4:Id ※TBx_Idは各TABLExのIdの事です。 上記構成で、Table3にTB4_idが登録されているのにTABLE4に データが無いものがあるので、その抽出が目的です。 Table1のID単位でTable4の無いもの、あるものの区別がしたいです。 具体的には、上記の結果が0かどうかで区別がつきます。 select count(*) from TABLE4 where Id in(select TB4_id from TABLE3 where TB3_id IN(select Id from TABLE2 where TB1_id=(TABLE1のId))); 上記SQLをTABLE1のId毎にチェックしたいです。TABLE1は数百件あるので。。。 どうぞよろしくお願いします。
- Siegrune
- ベストアンサー率35% (316/895)
> (1)select X from TABLE1; > ※where文を付けるケースもあります。 > (2)select count(*) from TABLE2 where Y2 IN(select X3 from TABLE3 where Y3=((1) > の結果を順に入れる); なら、 select table1.X,count(*) from TABLE2,table1 where table2.Y2 IN(select table3.X3 from TABLE3 where table3.Y3= table1.X) and table1.Y = 'test' /* とtable1に条件をつけてもよい */ group by table1.X でいいのでは?
- root139
- ベストアンサー率60% (488/809)
他には下記の様な方法も有りますね。まあ #1 さんの方法の方が分かりやすくて実行速度も速いかも知れませんが。 ■ 相関サブクエリを使って絞り込む方法 select Z, count(*) from TABLE2 where EXISTS (select * from TABLE1 where Y = 'test' AND TABLE1.X = TABLE2.Z) group by Z; ■ テーブル結合を使う方法 select t2.Z, count(*) from TABLE1 t1 INNER JOIN TABLE2 t2 ON (t1.X = t2.Z) where t1.Y = 'test' group by t2.Z;
お礼
アドバイスありがとうございます! 実際のSQLは以下の形です。 (1)select X from TABLE1; ※where文を付けるケースもあります。 (2)select count(*) from TABLE2 where Y2 IN(select X3 from TABLE3 where Y3=((1) の結果を順に入れる); (2)の条件が既に複数(IN)あります。 説明不足ですみませんでした。 自分でももう少し調べてみます。明日の朝までに何とかしなければならないので、アドバイスいただければ助かります。
- dda167
- ベストアンサー率76% (55/72)
--こういうことかしら? select Z, count(*) from TABLE2 where Z in (select X from TABLE1 where Y = 'test') group by Z;
お礼
アドバイスありがとうございます! 説明を簡略化しすぎていたようで、教えていただいた方法だと、Z毎に1件となり欲しい結果が得られませんでした。 実際のSQLは以下の形です。 (1)select X from TABLE1; ※where文を付けるケースもあります。 (2)select count(*) from TABLE2 where Y2 IN(select X3 from TABLE3 where Y3=((1) の結果を順に入れる); (2)の条件が既に複数(IN)あります。 説明不足ですみませんでした。
お礼
ありがとうございます! 自力でも一応PL/SQLでやってみました。 上記でも確認してみます。