SQLの結合条件について

このQ&Aのポイント
  • SQLの結合条件について解説します
  • テーブルAとBを結合する際の条件について説明します
  • テーブルAに存在する特定の値を除外して結果を得る方法を紹介します
回答を見る
  • ベストアンサー

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

  • Oracle
  • 回答数5
  • ありがとう数1

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答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' )

fisher2
質問者

お礼

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

その他の回答 (4)

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

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

fisher2
質問者

補足

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

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

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') でも良いし

fisher2
質問者

補足

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

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

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' でも可

fisher2
質問者

補足

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

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

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

fisher2
質問者

補足

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

関連するQ&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のみを抽出したいと思います。 内部結合は理解したのですが、これではできません。どうすれば解決できるのかお教え頂けませんでしょうか? よろしくお願い致します。

  • テーブル結合の条件指定について

    以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id    name ------------------ a1    aaa a2    bbb a3    ccc 【table_b】 b_id     a_id   user_id    point --------------------------------- b1     a1    00001    5 b2     a1    00002    2 b3     a3    00007    10 b4     a2    00356    10 【table_c】 c_id    user_id    cd     bonus_point ------------------------------------------------ c1     00001    cd_1    1 c2     00007    cd_2    1 c3     00356    cd_1    1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id)    LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id    total_point ----------------------------- 00356     11 00001      6 ■求めたい結果 user_id    total_point ----------------------------- 00356     11 00001      6 00002     2 よろしくお願いします。

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

  • テーブルのどちらかにデータがない事があるテーブル結合について

    ■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。

    • ベストアンサー
    • MySQL
  • oracle SQL

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

  • SQL HAVING句の使い方について

    以下のテーブルAとテーブルBを結合して結果テーブルを出力したいと考えています。 (テーブルA上のIDのカウントした数をテーブルBに結合して出力したい。) テーブルA ----------- CATE ID aaa 001 bbb 001 ccc 003 ddd 004 テーブルB ----------- ID NAME 001 101 002 102 003 103 004 104 結果テーブル ---------------------- ID NAME COUNT 001 101 2 002 102 0 003 103 1 004 104 1 そこで、 =================================== SELECT B.ID, B.NAME, COUNT(A.ID) FROM TABLE_A B, TABLE_B B GROUP BY B.ID, B.NAME, A.ID HAVING A.ID = B.ID =================================== とSQLを書いてみましたが、 002 102 0 のテーブルAにIDが存在していない列が結果として表示されませんでした。 WHERE句でいう「WHERE A.ID =* B.ID」のようなことを行いたいのですが、どのように行えばよいでしょうか? よろしくお願いいたします。

  • SQLのDELETEについての条件

    いつもお世話になってます。 タイトルの通りなのですが、SQLを触れたばかりなので、DELETE文の条件をどう書くか悩んでいます。 以下のテーブルAとテーブルBがあるとします。 テーブルA NO CODE  GROUP ---+------+------- 001 A20  AAAA 002 B10  AABB 003 B20  BBBB 004 A20  AABB 005 A10  BBBB 006 B10  AAAA テーブルB NO  ID  COMMENT ---+------+-------- 001 100  ****** 002 100  ****** 003 120  ++++++ 004 140  <<<<<< 005 170  \\\\\\ 006 110  %%%%%% 007 120  !!!!!! DELETEの条件として行いたいのは テーブルAのCODEが'A20'で、 テーブルAのその条件のNOとテーブルBのNOが同じものの時、条件に合ったテーブルBのレコードを削除したいものです。 例のテーブルでいえば、テーブルAはそのままで、テーブルBが次のようになるようにしたいです。 テーブルB NO  ID  COMMENT ---+------+-------- 002 100  ****** 003 120  ++++++ 005 170  \\\\\\ 006 110  %%%%%% 007 120  !!!!!! 分かりづらい説明かと思いますが、よろしくお願いします。 不明点があれば、補足にて追加していきます。

  • SQL文を教えてください。

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16

  • SQL 複数条件を設定

    PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1   a-2   b-1    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd      2   ggg   bbb   ccc        3   bbb   mmm  ddd       4   ggg   mmm  ccc    : TABLE2   a-1   a-2        c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     1   bbb   aaa        eee         2   ggg   mmm       qqq    : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1   a-2   b-1  c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd  eee    2   ggg   bbb   ccc   ※    3   bbb   mmm  ddd   ※    4   ggg   aaa   ccc   qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。