![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e6f04cf)
言葉で表現するよりも、サンプルの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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- Java Java 南京錠 2 2023/02/04 11:46
- 英語 提示した名言について(並列表現の文法規則) 4 2023/06/02 09:41
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Oracle SQL update方法 2 2022/06/22 14:07
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
SELECTした結果に行番号を求めたい
-
データの入れ替えを同時に行な...
-
複数の条件に該当する結果を、...
-
sqlに記述できない文字
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
Accessで今日から5日後
-
結合したテーブルをSUMしたい
-
データ削除とSQL*Loaderでのイ...
-
オラクルのUPDATEで複数テーブル
-
ACCESSのVBAにてExcelに行...
-
CASEでBETWEEN制約
-
Japanese schools tests
-
PostgreSQLのtimestamp型で時間...
-
【sqlite3】deleteしても.dbフ...
-
selectの単純繰り返し
-
エラーを起こす方法
-
データ無し時は空白行にしたい...
-
既存データをINSERT文にして出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
SELECTした結果に行番号を求めたい
-
UPDATEの更新前の値を取得したい
-
複数の条件に該当する結果を、...
-
データの入れ替えを同時に行な...
-
副問合せで複数列の値リストの...
-
プログラムよりファンクション...
-
oleDBでnumeric形式の小数部分...
-
PLPGSQLでの複数行複数列
-
SQLで小数点の計算がしたいです。
-
SQLで任意の列の最大値の定数は...
-
副問い合わせについて
-
この切り絵の元絵あれば下さい…!
-
ダブリ数字の有無の確認にのマ...
-
テーブル間の差分抽出方法は?...
-
数値を単一引用符で囲むのはど...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
スキーマ
-
sqlに記述できない文字
おすすめ情報