
言葉で表現するよりも、サンプルのSQL文で分析してもらう
方が理解しやすいと思いますので、そのやり方で進めさせて
もらいます。
実際にやりたいことは、
select * from example1 where (key1, key2) in (select key1, key2 from example2);
の値リスト版になります。
もちろん、上記のselect文での副問合せでは正常に結果は得られます。
実際にやってダメだった例は
select * from example1 where (key1, key2) in ((値A-1, 値A-2), (値B-1, 値B-2), (値C-1, 値C-1));
のようなパターンになります。
単にカッコで括ったリストにすればいいというものではないと判断できる
のですが、複数列の副問い合わせ文の値リストはどう表現すればよいのでしょうか?
プログラムを作る際、key1とkey2の連結されたものの集合で
それを実現する必要があるのですが、困り果てて、以下のように
key1とkey2を連結してから問い合わせさせるようにして、その場を
しのいでおります。連結されたものを再度key1とkey2に分割して
目的の副問い合わせをさせるのが狙いです。
select * from example1 where (key1 || key2) in (値1, 値2, 値3);
これでも十分結果は得られるのですが、key1、key2にせっかくインデックス
を作っていても連結しての問い合わせはその効果は得られず、結果を得る
までの所要時間が相当かかってしまうのが欠点です。できるだけ高速に
検索できるようにしたいのが今回の狙いなのですが、今回の件の記述方法
についてのアドバイスをお願いします。
No.2ベストアンサー
- 回答日時:
#1回答者です。
提示された表定義、データを使って実機確認したところ、私の環境では問題なく検索できました。
PostgreSQL 8.0.0(Windows版)で、pgAdminIIIから操作しています。
===表定義===
create table t_nyusatsu
(fno bigint not null,
id character varying(18) not null);
===格納データ===
insert into t_nyusatsu values(43,'000000000000216871');
insert into t_nyusatsu values(44,'000000000000216871');
insert into t_nyusatsu values(43,'000000000000999999');
===確認した検索SQL===
select * from t_nyusatsu where (fno, id) in ((43, '000000000000216871'));
select * from t_nyusatsu where (fno, id) in ((43, '000000000000216871'),(44, '000000000000216871'));
わざわざ検証までして下さってありがとうございます。
Windows版のpostgreSQL8.0.0をお使いなんですね。
私の環境はRed Hat Linux9.0上でpostgreSQL7.4.2を
使っています。
バージョンで違う反応をするようですね。
それだけが分かっただけでも収穫です。
ありがとうございます。必要に迫られたら最新バージョンに
アップデートして試してみようと思っています。
いろいろとありがとうございました。
No.1
- 回答日時:
>実際にやってダメだった例は
> ~中略~
>のようなパターンになります。
「ダメだった」とは、具体的にどういう状況になったのでしょうか?
文法エラーですか?それとも期待した結果と違ったのでしょうか?
実際に試したSQLを、示せませんか?
>複数列の副問い合わせ文の値リストはどう表現すればよいのでしょうか
念のため言っておきますが、質問者さんがやりたいといっている問い合わせは、副問い合わせとは呼びません。
PostgreSQLのバージョンは、何でしょうか?
試しに以下のようなSQLを実行してみましたが、私の環境(PostgreSQL 8.0.0)では、正しく検索できました。
select * from t1 where (c1,c2) in((1,11),(3,33),(5,55));
アドバイスの方、ありがとうございました。
PostgreSQLのバージョンですが、7.4.2になります。
8.0.0では正しく検索できるようですね。
そもそも7.4.2が標準SQLに準拠していなかったのでしょうか。
実際に試したSQL文とその結果を以下に載せておきます。
# select * from t_nyusatsu where (fno, id) in ((43, '000000000000216871'));
ERROR: syntax error at or near "43" at character 47
上記では、文法エラーとして判断されます。
fno, idのデータ型ですが、
fno | bigint | not null
id | character varying(18) | not null
としています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
UPDATEの更新前の値を取得したい
-
FETCH した行が取り出せない
-
プログラムよりファンクション...
-
複数の条件に該当する結果を、...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
UPDATEで既存のレコードに文字...
-
PostgreSQLのtimestamp型で時間...
-
SQLサーバに対するSQL文で抽出...
-
sqlに記述できない文字
-
truncate tableを使って複数の...
-
SQLで、Join句で結合したテ...
-
既にテーブルが存在する場合の...
-
エラーを起こす方法
-
SQLで一定時間周期毎の抽出方法...
-
Accessの構成をコピーしたい
-
既存データをINSERT文にして出...
-
Excel VBAのユーザーフォームで...
-
予約システムでの時間の設計に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
UPDATEの更新前の値を取得したい
-
複数の条件に該当する結果を、...
-
SELECTした結果に行番号を求めたい
-
データの入れ替えを同時に行な...
-
ダブリ数字の有無の確認にのマ...
-
プログラムよりファンクション...
-
PLPGSQLでの複数行複数列
-
副問合せで複数列の値リストの...
-
Pro*CでのSQL文について
-
where notにつて
-
パターンマッチング
-
SQLで小数点の計算がしたいです。
-
oleDBでnumeric形式の小数部分...
-
FETCH した行が取り出せない
-
複数カラムでdistinct
-
テーブル間の差分抽出方法は?...
-
SQLで任意の列の最大値の定数は...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
おすすめ情報