みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

抽出結果を1件ずつ次の抽出条件に使う方法

Oracleで下記のようなデータ処理を実現する方法を調べています。

(1)特定の条件でデータを抽出する。
 select X from TABLE1 where Y="test"

(2)(1)で抽出したデータを別の抽出条件の値として1つずつ使用し、
 別のsqlにてデータを抽出し、件数を取得する。
select count(*) from TABLE2 where Z = aaa
 ※aaaには(1)の結果を順に入れる。

2,3件であれば手作業で(2)を実施すればよいのですが、(1)の結果が数100件
になっているため、(2)をループ処理させたいです。
PL/SQLが必要なのでは?と思いつつ、使ったことがありません。
少し調べてはみましたが、よくわからず、困っています。
特に難しい処理ではないと思ってはいるのですが、期日まで時間がなく、質問
させていただきました。

一時的なデータ確認のためだけなので、専用にプログラムを組むのはしたく
無いと思っています。

参考になる情報をいただければ幸いです。
もちろん、(2)のサンプルコードなどいただければ大変助かります。

どうぞよろしくお願いします。

投稿日時 - 2012-09-22 05:22:25

QNo.7710672

すぐに回答ほしいです

質問者が選んだベストアンサー

--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お願いします(笑

投稿日時 - 2012-09-23 09:08:06

お礼

ありがとうございます!
自力でも一応PL/SQLでやってみました。
上記でも確認してみます。

投稿日時 - 2012-09-23 09:41:28

ANo.6

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

そんなに難しくないですよ。

select TABLE1.X , (select count(*) from TABLE2 where TABLE2.Z = TABLE1.X) from TABLE1

投稿日時 - 2012-10-04 20:00:05

お礼

ありがとうございます!

自前のPL/SQLの結果がどうも怪しいのでやり直しになりました(^_^;)

教えていただいた方法も参考にしてみたいと思います。

取り急ぎお礼まで。

投稿日時 - 2012-10-04 21:06:58

ANo.5

なるほど、他にも関係するテーブルが有ったのですね。
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')
;

投稿日時 - 2012-09-23 08:49:28

お礼

ありがとうございます!

試してみたいと思います。

今まで適当にOracle使っていたので、簡単に取得できそうなことに四苦八苦してしまいました。

取り急ぎお礼まで。

投稿日時 - 2012-09-23 09:44:09

ANo.4

--こういうことだったの?…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;

正確な回等が欲しければ正確に質問(できるだけ簡略化して)することです
最初の質問は簡略化したのではなく間違っていただけでしょう?
まだ何か隠していませんか?
簡単な例を挙げたほうがいいですね

投稿日時 - 2012-09-23 06:17:55

お礼

ご指摘ありがとうございます。
質問が不正確ですみません。
改めて下記に整理をしてみました。

--------------------------------
◆テーブル構成
 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は数百件あるので。。。

どうぞよろしくお願いします。

投稿日時 - 2012-09-23 07:21:48

ANo.3

> (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

でいいのでは?

投稿日時 - 2012-09-23 00:04:48

ANo.2

他には下記の様な方法も有りますね。まあ #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;

参考URL:http://gihyo.jp/dev/serial/01/sql_academy2/000901

投稿日時 - 2012-09-22 09:41:56

お礼

アドバイスありがとうございます!

実際のSQLは以下の形です。
(1)select X from TABLE1;
※where文を付けるケースもあります。
(2)select count(*) from TABLE2 where Y2 IN(select X3 from TABLE3 where Y3=((1)
の結果を順に入れる);

(2)の条件が既に複数(IN)あります。

説明不足ですみませんでした。

自分でももう少し調べてみます。明日の朝までに何とかしなければならないので、アドバイスいただければ助かります。

投稿日時 - 2012-09-22 23:33:42

ANo.1

--こういうことかしら?
select Z, count(*) from TABLE2 where Z in
(select X from TABLE1 where Y = 'test')
group by Z;

投稿日時 - 2012-09-22 07:00:28

お礼

アドバイスありがとうございます!

説明を簡略化しすぎていたようで、教えていただいた方法だと、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)あります。

説明不足ですみませんでした。

投稿日時 - 2012-09-22 23:32:19

あなたにオススメの質問