• 締切済み

Loop文による検索条件の変更

Loop文で検索条件を変えるSQL(plpgsql)を作成しようとしております。 具体的にはあるテーブルから、 select a,b from sample…(1) でデータを取得して、このa,bを用いて、 select * from sample2 where sarch = a and sarch2 = b…(2) 上記SQLを(1)の件数文LOOPさせる。 わからないことは、 ・(1)で取得した、aとbを(2)にどのように入れていくか。 ・(1)の件数をどのように取得してLOOPさせればよいか 以上2点です。 どなたかご教授いただけたらと思います。 参考URLも是非教えていただけたらと思います。 よろしくお願いいたします。

みんなの回答

回答No.2

#1です。提示したSQLに誤字がありましたね。失礼しました。 (1)行値式を使用する →where句のスペル誤りを訂正 select * from sample2 where (sarch,sarch2) in(select a,b from sample) ; (2)existsを使用する →where句のスペル誤りを訂正。表の別名での参照に統一 select * from sample2 as s2 where exists (select 1 from sample where a=s2.sarch and b=s2.sarch2) ;

回答No.1

PostgreSQLも、バージョンにより機能が大きく違います。使っているバージョン(少なくとも、8.0、8.4というように)を、明記するようにしてください。 まず、検索対象を最後まで検索したことを知るには、found という変数を参照する方法があります。 http://www.postgresql.jp/document/pg830doc/html/plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS 例えば、次のような使い方をします。 if not found then 参照する行がなくなった場合の処理 ; else 参照する行がある場合の処理 ; end if; sample表から検索した結果を、sample2表の検索に利用するだけなら、簡単な方法としてはサブクエリを使えばいいでしょう。 サブクエリの書き方としてはいろいろな方法がありますが、例えば行値式(あるいは行値識別子とも呼ばれる)を使う方法が簡単です。 (1)行値式を使用する select * from sample2 wgere (sarch,sarch2) in(select a,b from sample) (2)existsを使用する select * from sample2 as s2 wgere exists (select 1 from sample where a=s2.sarch and b=sarch2) なお、行値式は標準SQLにも入っているのですが、いくつかのRDBMSでは実装していないものや比較的、最近のバージョンで実装していたりするので注意してください。

yuta17
質問者

お礼

>PostgreSQLも、バージョンにより機能が大きく違います。使っているバージョン(少なくとも、8.0、8.4というように)を、明記するようにしてください。 質問の際には上記を注意します。ご指摘ありがとうございます。 (1)・(2)の方法、両方試して見たいと思います。 ご教授ありがとうございました。