- ベストアンサー
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は使わずにお願いします。
- fisher2
- お礼率9% (1/11)
- Oracle
- 回答数5
- ありがとう数1
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#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' )
その他の回答 (4)
- 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も抽出されてしまいます。
- 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と同じでなければ抽出対象なのです。 上記ができなくて困っています。
- 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の値を条件にはしたくないのですみません。
- nora1962
- ベストアンサー率60% (431/717)
「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文についてお教えください。 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する条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。
- 締切済み
- MySQL
- テーブルのどちらかにデータがない事があるテーブル結合について
■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で抽出できないかと考えております。 ただし、なるべくならワークテーブルのようなものは利用せずに 行いたいと思っております。 いい方法があれば教えていただきたいです。
- ベストアンサー
- Oracle
- 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」のようなことを行いたいのですが、どのように行えばよいでしょうか? よろしくお願いいたします。
- ベストアンサー
- Oracle
- 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 !!!!!! 分かりづらい説明かと思いますが、よろしくお願いします。 不明点があれば、補足にて追加していきます。
- ベストアンサー
- Oracle
- 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と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。
- ベストアンサー
- PostgreSQL
お礼
回答ありがとうございました。 思い通りの結果が得られました。