• 締切済み
  • すぐに回答を!

サブクエリを利用したSQL文から複数の抽出条件

例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数328
  • ありがとう数13

みんなの回答

  • 回答No.3
noname#209234

tbl.valueって、table_bに入ってるvalueカラムですよね。 補足でこういってますが >「1」と「20」の両方のレコードがあるものを抽出でした。m(_ _)m その1と20はどこに格納されてるんですか?それが答えだと思うんですが それとも、valueという名のカラムが二つあるってことですか? あるとすれば、table_cかなと思ったけど、table_c選択してないし・・・??? あと、休憩時間中に答えたんでまともに見てなかったのですが SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1' ここのJoinする意味は?table_bのtype=1のものだけで選択してるのもtable_bの全カラムですよね table_cの意味はなんですか? Innerとかならまだわかりますが、Leftの意味ってなんですか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

例題をなるべく現状のものに合わせようとしてちょっと複雑になってしまったようです。 もう少し整理して改めて質問を新たに出してみます。 有難うございました。

関連するQ&A

  • テーブルから複数のレコードにマッチする条件

    以下のようなSQL文があった場合 SELECT table_a.* FROM table_a LEFT JOIN table_b ON (table_a.id = table_b.aid) これでtable_bを連結したtable_aができると思いますが、table_bのフィールドは id , aid, value となっていた場合、valueが「1」かつ「2」のデータを検索する場合は、どのようにWHERE句を書けばいいのでしょうか。 WHERE (table_b.value = '1' AND table_b.value = '2') ではうまく取得出来ませんでした。 お分かりの方、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL サブクエリで抽出したカラムについて

    サブクエリで抽出したカラムを 本クエリでの結果と一緒に表示したいのですが どのように実現してよいかわからず困っております。 詳細としては、下記のようなことをしたいと考えております。 文中の1)と2)は文章下部にあるSQLを指しております ----------------------------------------------------------- 最初は、1)のように凄く単純なSQLでよかったのですが 仕様が変わり、TBL2で取得した新しいカラムも一緒に 本クエリでの結果として取得できれば、SQLを2回実行せずに済むなと考えたのですが、 2)のように色々と試行錯誤したのですが、実現できません。 (2)は単なる空想ですが…) そこで、わかる方にお伺いしたいのですが、 副問い合わせで取得した複数カラムの中の1つのカラム【2)でいうところのTBL2.X】 を 2)のように"select TBL1.A , TBL2.X"として、結果を得ることは可能でしょうか。 ただし、 TBL1のカラムAは、TBL2に存在しない TBL2のカラムXは、TBL1には存在しない カラムBは、TBL1、TBL2に存在する の条件となっております 環境はMysqlです テーブル結合の方法も考えたのですが、 TBL2で、日付でソートし、その上位100件だけを 持ってきたいと思ったので、副問い合わせで一気に抽出しようとこの方法を考えまし た お分かりになる方がいらっしゃいましたらよろしくお願いします 1)SQL ------------ select TBL1.A from TBL1 where TBL1.B in ( select TBL2.B from TBL2 where 条件 ) 2)想像SQL(こんな感じの事をしたい) -------------- select TBL1.A , TBL2.X from TBL1 where TBL1.B in ( select TBL2.B , TBL2.X from TBL2 where 条件 order by TBL2.日付 desc limit 100 )

    • ベストアンサー
    • MySQL
  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • 回答No.2

>WHERE (tbl.value='1' AND tbl.value='20') >としても結果が帰って来ません。 そりゃそうでしょう。 1つのフィールドで「1であると同時に20である」と言う条件は、絶対に成り立ちません。 「AND」じゃなくて「OR」ですよ。

共感・感謝の気持ちを伝えよう!

質問者からの補足

すみません、間違えました。 「1」と「20」の両方のレコードがあるものを抽出でした。m(_ _)m

  • 回答No.1
noname#209234

>valueフィールドが「1」と「20」 1または20のものを取得ですからor条件では・・・ valueカラムは1レコードに1つしかないんですよね?

共感・感謝の気持ちを伝えよう!

質問者からの補足

すみません、間違えました。 「1」と「20」の両方のレコードがあるものを抽出でした。m(_ _)m

関連するQ&A

  • オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?

    サブクエリーで複数キーを指定したいです。例えば以下のようなSQLですが、 SQL> > select * from テーブルA > where (key1,key2) in (select key1,key2 from テーブルB) このSQLはオラクルでは実行できますが、SQLSERVERでは文法エラーになってしまいます。SQL SERVER ではサブクエリーで複数キーを指定するのは不可能なのでしょうか?

  • サブクエリの複数項目

    いつもお世話になっております。 サブクエリで複数項目を取得する方法をご教授下さい。 [既存] select 商品, 価格, (select user_id from user_master where user_id = 1 ) from products where 商品ID = 1 上記のようなSQLがあり、 user_masterから取得する項目をもうひとつ追加したいと思っています。(user_name) select 商品, 価格, (select user_id, user_name from user_master where user_id = 1 ) as user from products where 商品ID = 1 と修正したいのですが、当然エラーになってしまいます。 この場合は別にサブクエリを指定して取得した方がいいのでしょうか。 宜しくお願い致します。

  • SQLの使用方法について(動的な結合条件の変更方法について)

    SQL Server2005を使用しています。 以下のような動作を実現したいのですが、どのようなSQLとなるのでしょうか? 以下のような構成のテーブルがあるとします。 テーブルA 分類1(PK) 分類2(PK) 名前 1     空文字   山田 1     1     山田太郎 1     2     山田花子 2     空文字   鈴木 テーブルB 番号(PK) 分類1 分類2 100  1   空文字 101  1   1 外部から受け取るパラメータはテーブルBの番号です。 次の番号を受け取った際に、以下の結果を取得したいのですが、 どのようなSQLとなるのでしょうか? 番号100 ↓ 山田 山田太郎 山田花子 番号101 ↓ 山田太郎 以下の様なSQLを作成して試してみたのですが、番号2をJOINの条件として指定しているため、 番号100の時に望む結果を得ることが出来ませんでした。 SELECT   * FROM   テーブルA AS A LEFT JOIN (   SELECT     *   FROM     テーブルB   WHERE     番号 = パラメータ ) AS B ON  A.分類1 = B.分類1 AND A.分類2 = B.分類2 サブクエリのB.分類2が空文字の場合は、JOINの条件から省くようなことは可能なのでしょうか?

  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • SQLの結合条件について

    SQLの結合条件について ・table_A ID | ATAI 01 | AAA 01 | XXX 02 | ABC 03 | DEF table_B ID | ATAI 01 | 不要 02 | 必要 03 | 必要 04 | 不要 上記のようなテーブルAとBがあるとします。 やりたいこと 1.テーブルAに存在するIDをBのIDから抽出 2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 ※テーブルAの01IDに’AAA’と’XXX’がありますが、Bの抽出対象から外したい。 2.がうまくいきません。 select B.ID from table_A A,table_B B where A.ID = B.ID 上記のSQLに2.の条件を足して、結果を02と03にしたいです。 ※CASEは使わずにお願いします。

  • NOT INをNOT EXISTSで書き直したい

    こんにちは。SQLでNOT INが実行速度が遅いため、EXISTSで書き直したいのですが、思っている結果がでません。 SQLのどこが間違っているかお教え頂けませんでしょうか? ■ ・テーブル名:R_TABLE ・フィールド:id データ: id(ユニークではない) 001 002 003 003 003 007 008 009 ■ ・テーブル名:P_Master ・フィールド:id データ: id(ユニーク) 001 002 003 ■やりたい事 R_TABLEのデータを条件によって削除したい。 条件はP_MASTERに無いR_TABLEの行を削除したいです。 ■欲しい結果 R_TABLE 001 002 003 003 003 ■書いたSQL DELETE FROM R_TABLE WHERE R_TABLE.id NOT IN (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) これは正しい結果がでました。 書きなおしたSQL DELETE FROM R_TABLE WHERE R_TABLE.id WHERE NOT EXISTS (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) 結果はR_TABLEから何も消されていませんでした。 どこを修正すれば正しい結果が得られるでしょうか? 副問い合わせで、R_TABLEとP_MASTERのINNER JOINの結果が得られ、R_TABLEからINNER JOINに含まれないデータ削除しろという命令だと思っていたのですが違うみたいです。 どこを修正すればよろしいでしょうか? よろしくお願いします。

  • sql文

    現在試合結果のSQL文を作っています。 テーブルは下記内容になっており、今までは個々のテーブルに試合日程IDを渡して表示させていました。 今までは ("select from 試合日程テーブル") ("select from 試合結果テーブル where 試合日程ID = 試合日程id") ("select from 試合味方得点者テーブル where 試合日程ID = 試合日程id") ("select from 試合相手得点者テーブル where 試合日程ID = 試合日程id") 現在はもっと簡単にできるのではないかと思い作り直そうと思っています。 試合日程テーブル | id | 相手 | | 0001 | 相手A | | 0002 | 相手B | | 0003 | 相手C | 試合結果テーブル | id | 試合日程ID | 得点 | 失点 | | 1 | 0001 | 6 | 0 | | 2 | 0002 | 4 | 4 | | 3 | 0003 | 0 | 5 | 味方得点者 | id | 試合日程ID | 得点者 | | 1 | 0001 | Aさん | | 2 | 0001 | Aさん | | 3 | 0001 | Bさん | | 4 | 0001 | Cさん | | 5 | 0001 | Dさん | | 6 | 0001 | Dさん | | 7 | 0002 | Aさん | | 8 | 0002 | Bさん | | 9 | 0002 | Cさん | | 10 | 0002 | Dさん | 相手得点者 | id | 試合日程ID | 得点者 | 1 | 0002 | 相手Aさん | | 2 | 0002 | 相手Bさん | | 3 | 0002 | 相手Cさん | | 4 | 0002 | 相手Cさん | | 5 | 0003 | 相手Aさん | | 6 | 0003 | 相手Aさん | | 7 | 0003 | 相手Aさん | | 8 | 0003 | 相手Cさん | | 9 | 0003 | 相手Cさん | ここで各試合結果を出したときに相手得点者、味方得点者をidごとに出す方法を教えていただけないでしょうか? 試してみたところ ("select from 試合日程テーブル") ("select from 試合結果テーブル) ( left join 試合味方得点者テーブル on 試合結果テーブル.試合日程ID = 試合味方得点者テーブル.試合日程id") ( left join 試合相手得点者テーブル on 試合結果テーブル.試合日程ID = 試合相手得点者テーブル.試合日程id") (where 試合結果テーブル.試合日程ID = 試合日程id) で試してみましたがうまくきませんでした。 上記のテーブルの内容で1試合に対し、得点者がちゃんと表示されるようにしたいです。 例:試合日程IDが0001の場合は味方得点者が6人分表示され、00002の場合は味方得点者が4人分と相手得点者が4人分表示されるように。 わかりにくい説明ではあると思いますが、宜しくお願いいたします。 足りない部分を指摘いただけると幸いです。

    • 締切済み
    • PHP
  • SQL文のINNER JOIN内での条件付けについて質問です

    SQLの質問です。 先程も質問させて頂いた件(http://okwave.jp/qa4089307.html)に派生した問題なのですが、 Accessのクエリにて SELECT A.*FROM grade_points AS A INNER JOIN [SELECT MAX(enforcement_date) AS MaxDate,grade_id FROM grade_points WHERE (enforcement_date)<=date() GROUP BY grade_id]. AS B ON (A.grade_id = B.grade_id) AND (A.enforcement_date = B.MaxDate); (前回の件のクエリにWHERE (enforcement_date)<=date() の条件を追加しました) というクエリを作ると、SQLを書いた直後の保存前はちゃんと動くのですが、保存後に閉じてから実行しようとすると「入力テーブルまたはクエリ(上記[]内SQL文)が見つかりません」というエラーになってしまいます。 INNER JOIN内のSQLにWhere条件は使えないのでしょうか??保存前は動くので不思議でなりません… お手数ですがどなたかご意見よろしくお願い致します。

  • phpMyadmin利用してCSV抽出のSQL文

    さくらのレンタルサーバを利用しています そのサーバにあるphpMyadminの利用での質問です phpMyadminの検索機能を利用して特定のレコードをcsvデータとして抽出したいと思います 例えば、テーブルaのid=1000の場合の画面表示は次のSQL文で表示されます ------------------- SELECT * FROM `tbl_a` WHERE `id` =1000 ------------------- パソコン側の保存先が C:\Documents and Settings\users\My Documents\SAKURA_DL" とした場合のSQL文はどのように記載すればいいか教えていただけませんか ちなみに 次のように記載してみたのですがエクスポートされません --------------------------------------------- SELECT * FROM `tbl_a` WHERE `id` =1000 INTO OUTFILE "C:\Documents and Settings\users\My Documents\SAKURA_DL" ---------------------------------------------- よろしくお願いします。

  • 1対多結合で多を絞り込み条件とするSQLについて

    1対多で結合する場合に、多が絞り込み条件となった場合のSQLについての質問です。 たとえばカスタムテーブルを使ったSELECT文などで、このような絞り込み条件が必要になると思います。 まずカスタムテーブルの具体例として、たとえばユーザーテーブルがあったとします。 [user_table] id=INT //オートインクリメント user_id=VARCHAR //adminなどのユーザーID文字列 user_pass=VARCHAR //パスワードを保存※ハッシュ化した値 user_name=VARCHAR //山田太郎などのユーザー名 user_mail=VARCHAR //ユーザーのメールアドレス user_description=TEXT //ユーザーの自己紹介文 user_created=DATETIME //ユーザーの登録日 とりあえず、上記のようなデータをユーザーの基本データだとします。 このユーザーテーブルから、たとえば名前を元に検索するのは単純です。 たとえばこのような感じでしょうか。 SELECT * FROM user_table WHERE user_name = '山田太郎' このテーブル構造を変更することなくカスタムデータを追加したい(しかも柔軟に)という要望を実現するために、ユーザーカスタムテーブルを作ったとします。 [user_custom_table] id=INT //オートインクリメント relational_id=INT //user_table.idへの参照 custom_name=VARCHAR //カスタムフィールド名 custom_value=VARCHAR //カスタムフィールドの値 custom_name、custom_valueには、たとえばそれぞれ以下のような値が入るとします。 custom_name、custom_value Birthday 、1998/1/1 CompanyName 、○○株式会社 CompanyTel、000-0000-0000 CompanyAddress、東京都千代田区○○-○○ user_custom_table.relational_idはuser_table.idにリレーションしているとすると、INNER JOINして値を取得する方法は判ります。 ※カスタムテーブルに値がない場合という状況は無視できる仕様です。 たとえば、会社住所が東京都で始まるユーザのみを抽出すると、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table ON user_table.id = user_custom_table.relational_id WHERE user_custom_table.custom_name = 'CompanyAddress' AND user_custom_table.custom_value LIKE '東京都%' ただ、この方法だと、誕生日が○月○日以前で、会社名に○○を含んで、会社住所が東京都で始まり…と検索条件が増えていった場合にINNER JOINがどんどん増えていって、いかにも効率が悪いと思えてなりません。 とりあえず適当に書いてみるとして、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table AS custom_1 ON user_table.id = custom_1.relational_id INNER JOIN user_custom_table AS custom_2 ON user_table.id = custom_2.relational_id INNER JOIN user_custom_table AS custom_3 ON user_table.id = custom_3.relational_id WHERE custom_1.custom_name = 'CompanyAddress' AND custom_1.custom_value LIKE '東京都%' AND custom_2.custom_name = 'Birthday' AND custom_2.custom_value < '2001/1/1' AND custom_3.custom_name = 'CompanyName' AND custom_3.custom_value LIKE '%○○%' もっと効率の良い書き方、一般的にはこういう場面ではこんな書き方をするなど、識者の方から教えを請いたくて質問しました。 ※ちなみにDBはMySQLですが、とくにMySQLに限らない方法で答えを頂ける方がありがたいです。

    • ベストアンサー
    • MySQL