電子書籍の厳選無料作品が豊富!

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も是非教えていただけたらと思います。

よろしくお願いいたします。

A 回答 (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)
;
    • good
    • 0

PostgreSQLも、バージョンにより機能が大きく違います。

使っているバージョン(少なくとも、8.0、8.4というように)を、明記するようにしてください。

まず、検索対象を最後まで検索したことを知るには、found という変数を参照する方法があります。

http://www.postgresql.jp/document/pg830doc/html/ …

例えば、次のような使い方をします。

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では実装していないものや比較的、最近のバージョンで実装していたりするので注意してください。
    • good
    • 0
この回答へのお礼

>PostgreSQLも、バージョンにより機能が大きく違います。使っているバージョン(少なくとも、8.0、8.4というように)を、明記するようにしてください。

質問の際には上記を注意します。ご指摘ありがとうございます。

(1)・(2)の方法、両方試して見たいと思います。
ご教授ありがとうございました。

お礼日時:2009/11/29 17:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!