質問 |
||
| QNo.2901256 | 副問合せで複数列の値リストの作り方 | |
|---|---|---|
| 質問者:genxo2001 |
言葉で表現するよりも、サンプルの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にせっかくインデックス を作っていても連結しての問い合わせはその効果は得られず、結果を得る までの所要時間が相当かかってしまうのが欠点です。できるだけ高速に 検索できるようにしたいのが今回の狙いなのですが、今回の件の記述方法 についてのアドバイスをお願いします。 |
|
困り度:
|
||
| 質問投稿日時: 07/04/07 11:06 |
||
回答良回答20pt |
|
| ANo.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')); |
|---|---|
| 回答者:chukenkenkou | |
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| 回答日時: 07/04/07 17:22 |
|
| |
| この回答へのお礼 | わざわざ検証までして下さってありがとうございます。 Windows版のpostgreSQL8.0.0をお使いなんですね。 私の環境はRed Hat Linux9.0上でpostgreSQL7.4.2を 使っています。 バージョンで違う反応をするようですね。 それだけが分かっただけでも収穫です。 ありがとうございます。必要に迫られたら最新バージョンに アップデートして試してみようと思っています。 いろいろとありがとうございました。 |
回答 |
|
| ANo.1 | >実際にやってダメだった例は > 〜中略〜 >のようなパターンになります。 「ダメだった」とは、具体的にどういう状況になったのでしょうか? 文法エラーですか?それとも期待した結果と違ったのでしょうか? 実際に試したSQLを、示せませんか? >複数列の副問い合わせ文の値リストはどう表現すればよいのでしょうか 念のため言っておきますが、質問者さんがやりたいといっている問い合わせは、副問い合わせとは呼びません。 PostgreSQLのバージョンは、何でしょうか? 試しに以下のようなSQLを実行してみましたが、私の環境(PostgreSQL 8.0.0)では、正しく検索できました。 select * from t1 where (c1,c2) in((1,11),(3,33),(5,55)); |
|---|---|
| 回答者:chukenkenkou | |
| 種類:補足要求 どんな人:経験者 自信:参考意見 |
|
| 回答日時: 07/04/07 12:32 |
|
| |
| この回答へのお礼 | アドバイスの方、ありがとうございました。 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 としています。 |