- ベストアンサー
副問合せで複数列の値リストの作り方
- 副問合せで複数列の値リストを作成する方法についてのアドバイスをお願いします。
- 現在の記述方法では効果的なインデックスを使用できず、結果の取得までに時間がかかるため、高速な検索方法を探しています。
- どのように複数列の副問合せ文の値リストを表現すれば効率的な検索が可能になるのかお教えください。
- みんなの回答 (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'));
その他の回答 (1)
- chukenkenkou
- ベストアンサー率43% (833/1926)
>実際にやってダメだった例は > ~中略~ >のようなパターンになります。 「ダメだった」とは、具体的にどういう状況になったのでしょうか? 文法エラーですか?それとも期待した結果と違ったのでしょうか? 実際に試した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 としています。
お礼
わざわざ検証までして下さってありがとうございます。 Windows版のpostgreSQL8.0.0をお使いなんですね。 私の環境はRed Hat Linux9.0上でpostgreSQL7.4.2を 使っています。 バージョンで違う反応をするようですね。 それだけが分かっただけでも収穫です。 ありがとうございます。必要に迫られたら最新バージョンに アップデートして試してみようと思っています。 いろいろとありがとうございました。