副問合せで複数列の値リストの作り方

このQ&Aのポイント
  • 副問合せで複数列の値リストを作成する方法についてのアドバイスをお願いします。
  • 現在の記述方法では効果的なインデックスを使用できず、結果の取得までに時間がかかるため、高速な検索方法を探しています。
  • どのように複数列の副問合せ文の値リストを表現すれば効率的な検索が可能になるのかお教えください。
回答を見る
  • ベストアンサー

副問合せで複数列の値リストの作り方

言葉で表現するよりも、サンプルの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'));

genxo2001
質問者

お礼

わざわざ検証までして下さってありがとうございます。 Windows版のpostgreSQL8.0.0をお使いなんですね。 私の環境はRed Hat Linux9.0上でpostgreSQL7.4.2を 使っています。 バージョンで違う反応をするようですね。 それだけが分かっただけでも収穫です。 ありがとうございます。必要に迫られたら最新バージョンに アップデートして試してみようと思っています。 いろいろとありがとうございました。

その他の回答 (1)

回答No.1

>実際にやってダメだった例は > ~中略~ >のようなパターンになります。 「ダメだった」とは、具体的にどういう状況になったのでしょうか? 文法エラーですか?それとも期待した結果と違ったのでしょうか? 実際に試したSQLを、示せませんか? >複数列の副問い合わせ文の値リストはどう表現すればよいのでしょうか 念のため言っておきますが、質問者さんがやりたいといっている問い合わせは、副問い合わせとは呼びません。 PostgreSQLのバージョンは、何でしょうか? 試しに以下のようなSQLを実行してみましたが、私の環境(PostgreSQL 8.0.0)では、正しく検索できました。 select * from t1 where (c1,c2) in((1,11),(3,33),(5,55));

genxo2001
質問者

お礼

アドバイスの方、ありがとうございました。 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

  • 副問い合わせについて

    お世話になります。明日から仕事で使うのですが、下記の構文が よく理解できません。宜しくお願い致します。 SQL Severは経験ありません。 経験はInfomixSql,Access,MySql程度です。 (1)行副問い合わせ(副問い合わせの結果が1行n列で返ってくる) SELECT * FROM t1 WHERE (c4, c2) = (SELECT MAX(c1), 'a' FROM t2); このwhere節の結合条件はどのような感じになるのでしょうか? (2)表副問い合わせ(副問い合わせの結果がm行n列(表)で返ってくる) SELECT * FROM t1 WHERE c4 IN ( SELECT c1 FROM t2 WHERE c4 >= 10 ) ORDER BY c1; 、 SELECT x1.c1, x2.y4 FROM t1 x1, ( SELECT c3, SUM(c4) AS y4 FROM t2 GROUP BY c3) AS x2 WHERE x1.c3 = x2.y4 ORDER BY c1; (1)に同じです。 参考になりそうなサイトでも結構ですので 宜しくお願い致します。

  • IN句に副問合わせを使う場合と使わない場合

    お世話になります。 SQLについての質問です。 RDBMSはSymfowareです。 IN句に副問い合わせを指定するSQLと その副問い合わせの結果を直接IN句に記載したSQLで 結果が異なってしまいます。 こういうことってありますでしょうか。 以下のようなSQLです。 (1) SELECT * FROM T1 WHERE T1.column_A IN ( SELECT T2.column_A FROM T2 WHERE T2.column_B='XXXX' ) 上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。 (2) SELECT * FROM T1 WHERE T1.column_A IN ('A','B','C','D') この(1)、(2)のSQLの結果が異なってしまいます。 私の環境では(1)では0件、(2)では2件ヒットします。 なぜこのようになるのかわかる方がいらっしゃいましたら ご教授ください。 ちなみに、DBを操作して、副問い合わせのSELECT文の結果を 'A'、'B'とすると同じ結果が得られます。 副問い合わせのSELECT文の結果が3件以上になると(1)のSQLの 結果は0件になってしまいます。 RDBMSの障害でしょうか・・・? それとも、IN句に副問い合わせを使用する場合、 その副問い合わせの結果は2件以下にする必要がある なんてルールがあったりするのでしょうか。

  • SQLで取得した値をListの値の並び順にしたい

    Listに入っている値とSQLで取得した値を突き合わせてSQLで取得した値を Listに入っている値の並び順にしたいです。 ↓イメージ List[A01,A02,C03,A03] のようにコード値が入っています。 SELECT コード(A01,A02,...),名称(A01名,A02名,...) FROM table で取得した結果を A01名,A02名,C03名,A03名で並ばせたいです。 環境はJavaです。よろしくお願いします。

    • ベストアンサー
    • Java
  • SQLで取得した値をListの値の並び順にしたい

    Listに入っている値とSQLで取得した値を突き合わせてSQLで取得した値を Listに入っている値の並び順にしたいです。 ↓イメージ List[A01,A02,C03,A03] のようにコード値が入っています。 SELECT コード(A01,A02,...),名称(A01名,A02名,...) FROM table で取得した結果を A01名,A02名,C03名,A03名で並ばせたいです。 環境はJavaです。よろしくお願いします。

  • SQL副問い合わせって?

    ただいま初級シスアドのテキストを勉強中です。その中の「SELECT文、比較演算子を使った副問い合わせ」というページです。 例)SELECT 氏名,点数 FROM 学生一覧      WHERE 点数=(SELECT MAX(点数)      FROM 学生一覧) というのは    SELECT 氏名,点数 FROM 学生一覧      WHERE 点数=MAX(点数) というのでは何故ダメなのですか?結果同じじゃないのと思ってしまうのですが。 「SELECT文の中で一時的に別のSELECT文を呼び出す」という説明は理解できるのできるのですが、どうしてわざわざ面倒にするのだろうと不思議です。 全く私がわかっていないという事なんでしょうが、どなたかご面倒をお掛けいたしますがお教えください。お願いいたします。

  • 副問合せ

    問題:NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 方がうまくいきません。 私の考えた下記SQL文では実行結果が80件返ってしまいます。 答えは方法2と同じ5件ですがどこが悪いのでしょうか? 回答のほどよろしくお願い致します。 方法1:主問合せでNATION表を利用する SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) 方法2:主問合せでINVENTION表を利用する SELECT DISTINCT NATION_CODE FROM INVENTION WHERE NATION_CODE = ANY(SELECT CODE FROM NATION WHERE 100 >= POPULATION / AREA) NATION_CODE ----------- 107 136 142 154 157

  • 副問合せの書き方について

    実行したい内容は、『同一ナンバー内で1番IDが低いコードNOが2のタイトルを出す』といった内容になります。 以下のように書いて実行したところ、『EXISTSを使わないサブクエリでは、サブクエリの選択リストには、式を1つだけしか使えません。と表示されました。』自身のSQL文に問題があるかもしれませんが、現状は下記のSQL文となっています。 "SELECT id, code, num, title FROM contents WHERE code=2 AND id IN (SELECT MIN(id), num FROM contents GROUP BY num)" 副問合せで、同一ナンバーで1番IDが低いIDを取得し、取得したIDをもとに タイトルを出そうとしました。 どなたか御指導御願い願えませんでしょうか。 宜しく御願いいたします。

  • 副問い合わせの不可解な問題

    情報処理試験を受験しようと思いますが、前提知識の補強に今苦戦しています。SQLの問題で以下の出題趣旨と解答の理由がわかりませんでした。どなたか解釈いただければ幸いです。 問)次の表1と表2に対するSQL文のうち、適切なものはどれか 表1        表2 X | Y |Z |   X | Y |Z | a1 | b1|1|  d1 | e1|1| a2 | b2|1|  d2 | e2|1| a3 | b3|2|  d3 | e3|2| ア.Select X FROM 表1  WHERE ( SELECT Y FROM 表2 ) = Y イ.Select X FROM 表1  WHERE Y IN( SELECT * FROM 表2 WHERE Z = 1) ウ.Select X、Y FROM 表1  WHERE Y IN( SELECT Y FROM 表2 WHERE Z = 1) エ.Select X、Y FROM 表1  WHERE Y =( SELECT Y FROM 表2 WHERE Z = 1) 正解はウですが。ウではどのような表が最終的にできるのかわかりません。副問い合わせの仕組みはおぼろげに他の本でわかりましたが、本設問については何度考えてもわかりません。 どなたか助けてください。、。

  • 副問い合わせの限界値はどれくらいなのでしょうか? 

    副問い合わせの限界値はどれくらいなのでしょうか?  現在下記のようなSQLを考えています。 SELECT * FROM A_TABLE WHERE a_field in ( SELECT a_field FROM B_TABLE WHERE b_field := ?c ) ; ※(便宜上、外部変数の指定を[:= ?c]としました) B_TABLEの検索に引っかかったデータをinの条件にしてA_TABLEを検索するのですが、 B_TABLEの検索で出力される結果(サブクエリで出力される件数)が 現在の理論値は平均でおおよそ1000件、最大10万件になる予定です。 これに対し、10万件での問い合わせに副問い合わせの実行はmysqlで可能なのでしょうか?  現状のテスト環境では10万件のテストデータを用意できない状況です・・・。 また、どなたか副問い合わせでのサブクエリ出力件数の限界値をご存知の方がいらっしゃいましたらご教授頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • select句副問い合わせ 値の個数が多すぎます

    SQL初心者です。 ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。 解決法をご教授願います。 同一テーブルの同一項目を複数項目として取得したいのです。 SELECT (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.CCC), (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.FFF) FROM C_MST CMST WHERE CMST.A_RYAKU = '123'