• ベストアンサー
  • 困ってます

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は使わずにお願いします。

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

  • 回答数5
  • 閲覧数207
  • ありがとう数1

質問者が選んだベストアンサー

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

#1です。 勘違いしてました。 select B.ID from table_B B WHERE EXISTS ( SELECT 1 FROM table_A WHERE A.ID = B.ID ) AND NOT EXISTS ( SEleCT 1 FROM table_A WHERE A.ID = B.ID AND A.ATAI = 'AAA' )

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

質問者からのお礼

回答ありがとうございました。 思い通りの結果が得られました。

関連するQ&A

  • AccessSQL 1つのテーブルに複数のデータ

    お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。

  • サブクエリを利用した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する条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • この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つ並べている意味がよく分かりません。 よろしくお願いします。

その他の回答 (4)

  • 回答No.5
  • bin-chan
  • ベストアンサー率33% (1403/4213)

「'AAA'が登場するIDは、他の条件を付けることなく除外したい」で良いんですね? (なぜ'XXX'が登場したんだろう?) ならばATAIに'AAA'が登場するIDのリストを作り、NOTで否定すればよい。 where条件に以下の一行を追加。 and A.ID not in (select ID from table_A where ATAI='AAA')

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

質問者からの補足

and A.ID not in (select ID from table_A where ATAI='AAA') だと、01は抽出されてしまうんです。 ATAI='AAAはnot inではじけますが、'XXX'ははじけないので。 説明下手ですが、 上記の条件では質問内容にある、2テーブルを作成し実行すると、ID01も抽出されてしまいます。

  • 回答No.4
  • bin-chan
  • ベストアンサー率33% (1403/4213)

Where条件を編集する工夫はご自身でできませんか? whereに追加の場合は and A.ATAI not in ('AAA', 'XXX') でも and not(A.ATAI = 'AAA' or A.ATAI = 'XXX') でも良いし INNER JOINの場合は where A.ATAI not in ('AAA', 'XXX') でも where not(A.ATAI = 'AAA' or A.ATAI = 'XXX') でも良いし

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

質問者からの補足

説明不足だったかもしれませんが、 条件としては、テーブルAのATAI「AAA」のIDを抽出対象外にしたいのです。 それでは、XXXの値も抽出対象外になってしまいます。 値がXXXでも、AAAの値のIDと同じでなければ抽出対象なのです。 上記ができなくて困っています。

  • 回答No.2
  • bin-chan
  • ベストアンサー率33% (1403/4213)

Where条件を増やすとか select B.ID from table_A A,table_B B where A.ID = B.ID and A.ID <> '01' select B.ID from table_A A inner join table_B B on A.ID = B.ID where A.ID <> '01' でも可

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

質問者からの補足

>2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 を実現したいので、IDの値を条件にはしたくないのですみません。

  • 回答No.1

「JOIN」が使えない事情があるのでしょうか? select B.ID from table_A A JOIN table_B B ON A.ID = B.ID AND B.ATAI = '必要'

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

質問者からの補足

JOINが使えない事情はありません。 条件の部分をご教授頂ければ助かります。 説明不足だったかもしれませんが、 ’必要’の文字列は抽出したいという気持ちを表したもので、 本来’必要’という文字列では無く、B.ATAIには何が入っているかわかりません。

関連するQ&A

  • [SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

    [SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい 初めてお世話になります。 データベース種別はH2です。 参考:http://www.h2database.com/html/main.html 下記のようなテーブルAがあるとします。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   1   |  def   |   1   |  ghi   |   2   |  abc   |   2   |  ghi   |   3   |  abc   |   3   |  def   |   3   |  ghi   |   4   |  abc   | 上記テーブルAから下記例のような結果を得られるSQLを知りたいのです。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   2   |  abc   |   3   |  abc   |   4   |  abc   | 上記結果でなくとも、   ID  |  TAG  | ―――――+―――――|   1   |  def   |   2   |  ghi   |   3   |  def   |   4   |  abc   | であっても構いません。(TAG列のデータはどんな内容でもよいです。) 実現させたいのは、 (1)ID列が重複しない結果を表示させたい、 かつ (2)TAG列も表示させたい ということです。 これでイケるだろ!と思ってあえなく失敗したSQLは下記です; select distinct(ID), TAG from A 宜しくお願い致します。

  • 結合して余りを抽出したい

    こんにちは。SQL文についてお教えください。 TABLE AとTABLE Bがあります。両テーブルにはIDというフィールドがあります。 データは下記のように入っているとします。 TABLE A ID:1,2,3,4,5 TABLE B ID:1,2,3 SQL文を実行した時、4,5を抽出したい。 二つのテーブルを比べ、片方のテーブルにないものを抽出したいと思っています。 つまり、TABLE A - TABLE Bを行い、余ったIDのみを抽出したいと思います。 内部結合は理解したのですが、これではできません。どうすれば解決できるのかお教え頂けませんでしょうか? よろしくお願い致します。

  • SQL最大値レコード抽出について

    下記のようなテーブルがあったとしてフィールド1のコードごとにフィールド2が最大値のものを抽出したいのですが一回のSQLで可能ですか? フィールド1 フィールド2 abc 20070309 abc 20070302 abc 20070307 def 20070304 def 20070306 def 20070303 ・ ・ ・ 例: abc 20070309 def 20070306 ・ ・

    • ベストアンサー
    • MySQL
  • 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
  • SQL(oracle)での並べ替え

    SQL(oracle)での並べ替えで質問がございます。 TABLE:AAA NO, NAM,GNo, DATE ------------------ 1, abc, 3, 09/01 2, bcd, 2, 08/25 3, cde, 2, 08/23 4, def, 3, 09/05 5, efg, 1, 09/03 6, fgh, 3, 08/21 のようなテーブルがあったときに、下記条件で並べ替えを したいと思っています。 1.GNo毎に最小のDATEを抽出し、各Gnoの最小のDATEのうち   小さいGNoのグループでソート。 2.1で同一GNo内ではDATEが小さい順にソート。 つまり、上記の例では、各GNoの最小のDATEは、 1・・・09/03 2・・・08/23 3・・・08/21 なので、これからDATEの小さい順に、GNoが 3、2、1の順にソートをします。各GNo毎にもDATEが小さい順に ソートをするので、結果として、 NO, NAM,GNo, DATE ------------------ 6, fgh, 3, 08/21 1, abc, 3, 09/01 4, def, 3, 09/05 3, cde, 2, 08/23 2, bcd, 2, 08/25 5, efg, 1, 09/03 のような順番にしたいのです。この結果のようにするには、 どのようなSQLにすればよいでしょうか? よろしくお願いいたします。

  • oracle SQL

    以下のようなことを実現する方法についてお教え頂きたいです。 ■テーブル [XXXマスタ] ID char(8) 上記のテーブルにはIDという項目があるのですが、このテーブルで 使用していないIDのみをSQLで抽出できないかと考えております。 ただし、なるべくならワークテーブルのようなものは利用せずに 行いたいと思っております。 いい方法があれば教えていただきたいです。

  • データがあれば○○なければのSQL

    基本的なことなのかもしれませんが・・・ AとBというテーブルがあり、あるタイミングでAを元にBを作成します。つまりBはデータがある場合とない場合があります。また、2つは関連番号で紐づいています。 Aテーブルを抽出したい時に、抽出条件は以下です。 ・Bテーブルのステータスが1であれば抽出 ・Bテーブルのステータスが0であれば非抽出 ・Bテーブルにデータがなければ抽出 INNER JOINだとデータがない時に抽出できないし、 WHERE句にCASE句を入れればいいのかなと思いましたが、テーブルにデータがあればなんて条件書けないしで詰まりました。 SELECTした結果に対して条件つけて抽出する手も思いつきましたが もっと美しいSQLがあれば教えてもらえないでしょうか。 環境はSQLServerです。よろしくお願いします。

  • これを抽出するSQLを教えてください

    どういうSQLを書けばこれが実現出来るのか分からないので教えて下さい。 テーブル名 f_table というテーブルがあります。 このテーブルには、f_id,u_id,day(日付)という三つの列があり、下記のようにデータが入っているとします。 f_id  u_id    day   1    1   2007/3/8 2    2   2008/1/2 3    2   2008/1/10 4    1   2007/2/12 このf_tableから、各u_idで一番日付の新しいf_idを抽出する(この表の場合f_idの1と3が抽出される)にはどういうSQLで出来るのでしょうか? ※実際の表ではu_idに入っている数字の種類は1と2だけではなく、もっと沢山あります。 ご回答よろしくお願いします。

  • SQLがわかりません。その2

    VB2010とSQL Server2008 R2 でWindowsアプリを作っている新米です。 下のような表(DataDridView)で表示したいと考えています。(本当は月曜から金曜までの 5日間ですが、便宜上4日間で表現しました。) 品名ID 月曜 入荷 出荷 火曜 入荷 出荷 水曜 入荷 出荷 木曜 入荷 出荷 aaaaaa 6/12 2000 1500 6/13 1000 1000 6/14 1300 2000 6/15 3300 2000 bbbbbb 6/12 1000 2500 6/13 3000 4500 6/14 4200 3000 6/15 2000 1000 cccccc 6/12 1000 1500 6/13 1000 3400 6/14 1700 2600 6/15 3500 1000 dddddd 6/12 1500 1800 6/13 2200 1000 6/14 3300 1000 6/15 4100 2200  ・  ・ テーブル(table_meisai)はこのように構成されています。 meisai_id hinmei_id date in_suryo out_suryo したがって SELECT hinmei_id,date,in_suryo,out_suryo FROM table_meisai WHERE date BETWEEN 6/12 AND 6/16 とすると、当然のことながら aaaaaa 6/12 2000 1500 aaaaaa 6/13 1000 1000 aaaaaa 6/14 1300 2000 aaaaaa 6/15 3300 2000 aaaaaa 6/16 3200 3500 bbbbbb 6/12 1000 2500 bbbbbb 6/13 3000 4500  ・  ・ と出てきてしまうわけです。 で、これを上記のような「hinmei_id」単位で1行にした「表」にしたいと考えているのですが、 そのSQLがわからないという状況です。 SQLの組立て方法を教えて下さい。 よろしくお願いします。

  • MySQLのSQLについて

    テーブル名:table ------------------------------------ 初回アクセス,日付,名前,顧客ID,URL Y,2017/01/01,Aさん,001,http://aaa.jp NULL,2017/01/01,Aさん,001,http://aaa.jp/test.php NULL,2017/01/01,Aさん,001,http://aaa.jp/blog/ Y,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/test.php NULL,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/blog/ Y,2017/01/03,Cさん,003,http://aaa.jp/test.php NULL,2017/01/03,Cさん,003,http://aaa.jp ------------------------------------ 上記の様なテーブルを作りアクセスデータを蓄積しています。 これらを1ページ目のランキング、2ページ目のランキング、3ページ目のランキングとつくりたいです。 例えば、 ------------------------------------ SQL ------------------------------------ SELECT `table`.`URL`, COUNT( `table`.`URL`) AS `count` FROM `table` WHERE `table`.`初回アクセス` = 'Y' GROUP BY `table`.`URL`; ------------------------------------ 結果 ------------------------------------ URL,count http://aaa.jp,2 http://aaa.jp/test.php,1 1ページ目のランキングは上記SQLで作れるのですが、2ページ目以降のランキングの作り方が分かりません。 何か良い方法等ありませんか?

    • ベストアンサー
    • MySQL