• ベストアンサー
  • すぐに回答を!

SQLでの抽出条件

SQL初心者です。初歩的な質問だと思いますが、ご教授願います。 以下のような2つのテーブルがあります。 【テーブルA】 グループ 社員番号 A 1 A 2 A 3 B 4 B 5 B 6 C 7 C 8 D 9 D 1 【テーブルB】 社員番号 1 9 テーブルBの社員番号と一致する場合、テーブルAをグループ単位で抽出しないようにしたいです。  ・グループAは社員番号1が一致するため抽出しない。  ・グループDは社員番号1と9が一致するため抽出しない。 【取得結果】 グループ 社員番号 B 4 B 5 B 6 C 7 C 8 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。

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

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

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

  • ベストアンサー
  • 回答No.2
  • nda23
  • ベストアンサー率55% (773/1384)

いつも言っているのですがSQLは論理の組み立てが 大切です。 1.テーブルAからテーブルBに結合するレコード数を  数える。レコード数が0のものが抽出対象になる。 2.上記クエリと結合するテーブルBのデータが求める  結果になる。 1のクエリ SELECT A.グループ FROM テーブルA AS A LEFT JOIN テーブルB AS B ON A.社員番号 = B.社員番号 GROUP BY A.グループ HAVING COUNT(B.社員番号) = 0 2のクエリ SELECT A.* FROM テーブルA AS A INNER JOIN (SELECT A.グループ FROM テーブルA AS A LEFT JOIN テーブルB AS B ON A.社員番号 = B.社員番号 GROUP BY A.グループ HAVING COUNT(B.社員番号) = 0) AS B ON A.グループ=B.グループ サブクエリの()内は1と全く同じです。 闇雲にSQL構文を覚えるより、理論の構築を 心がけましょう。SQLのSはStructureで、 構造を意味します。論理構造が大切です。

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

質問者からのお礼

ご丁寧に回答頂きましてありがとうございます。 論理的に組み立てができるように精進したいと思います。

関連するQ&A

  • 簡単なSQLに関して

    初歩的なSQLの質問で申し訳ありません。 教えて下さい。 下記のような、ある2つの異なる名前の同項目のテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容 Bテーブル  社員番号、日付、内容  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 どのようなSQLを書けば良いでしょうか?? 尚、テーブルに関しては、諸事情であえて2つに分けてあります。 よろしくお願いします。

  • SQLで条件の文字列を含んでいるデータを取得する方法

    SQLにて指定した文字列を含むデータを取得する方法を探しています。 例 テーブル Test 番号   条件 __________ 01    AA 02    BB 03    AA,CC 上記のように、番号と条件という2つのフィールドを持っているテーブルをTestとします。 (1)条件にAAと指定すると、番号01と03が取得。 (2)条件にBBと指定すると、番号02が取得。 (3)条件にAAAと指定すると、一致条件なし。 (1)~(3)のような条件を満たすSQLの構文はありませんでしょうか? ご教授お願いいたします。

  • 場合によって条件を変えるSQL

    ORACLE環境下、SQLにて以下のような条件でデータを取得したいです。 AテーブルとBテーブルを結合して、Bテーブルから名称を取得する。 <Aテーブル> id (key) 番号1 番号2 A01  001  n0001 A02  null  n0002 <Bテーブル> code(key) 名前  番号1 番号2 c0001   太郎  001  n0001 c0002   次郎  002  n0002 (1)A.番号が入力されていれば A.番号1=B.番号1 AND A.番号2=B.番号2を条件にする (2)A.番号が入力されていなければ A.番号=B.番号を条件からはずす。 A.番号2=B.番号2 のみで検索する。 <欲しい結果> A01→太郎を取得 A02→次郎を取得 入力されていたら条件に加え、入力されていなかったら 条件から外す、というSQLを教えていただけないでしょうか。 よろしくお願いいたします。

その他の回答 (2)

  • 回答No.3

select * from テーブルA A1 where not exists ( select 1 from テーブルA A2 where A1.グループ=A2.グループ and exists ( select 1 テーブルB FROM テーブルB B where A2.社員番号 = B.社員番号 )); のようなやり方もあります。 select * from テーブルA where グループ not in ( select グループ from テーブルA where 社員番号 IN ( SELECT 社員番号 FROM テーブルB )); も。

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

質問者からのお礼

返信が遅れて申し訳ありません。 そのようなやり方もあるのですね。 大変参考になりました。ありがとうございます。

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

実機が無いので試験してませんが。 select グループ, 社員番号 from テーブルA where グループ not in ( select distinct グループ from テーブルA inner join テーブルB on テーブルA.社員番号 = テーブルB.社員番号 ) ; で、どうでしょう?

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

質問者からのお礼

さっそくのご回答ありがとうございます。 私も実機がないため、明日早急に試させて頂きます。

関連するQ&A

  • acccess:クエリの抽出条件

    助けてください_(._.)_ アクセスの選択及び更新クエリで あるテーブル「t_抽出」の「社員番号」フィールドと一致したレコードのみ選択して情報を更新したいのですが。 式ビルダを使ってで抽出条件のところに [t_抽出]![社員番号] と入れるのですが 実行するとパラメータが出てくる どうして?何がいけないのでしょうか(・・? どうぞよろしく

  • 複雑な抽出条件のSQL文

    まだまだ初心者ですがよろしくお願いします。 以下の条件でDBからデータを抽出したい場合のSQLを 教えていただきたいです。 ・テーブルAがありカラムがA、Bとある。 ・Aは重複できないようになっているがBは重複可。 ・Bが重複しているレコードのAの値が欲しい。 環境はSQLServer2000+VB6.0です 情報が足りないかも知れませんがよろしくお願いいたします。

  • 2つのテーブルを比較して、不一致レコードを抽出するSQL文

    2つのテーブルを比較して、不一致レコードを抽出するSQL文を教えてください。まったくの初心者なので、よろしくお願いします。

  • SQLでデータを抽出する方法

    テーブルAとテーブルBがあり、AとBには「項目番号」と言うフィー ルドがそれぞれある。 この時、Aの「項目番号」とBの「項目番号」が一致しないデータを 抽出したい。 例: A:番号,名称   1 ,あ   2 ,い   3 ,う B:番号   1   4   5 この場合、抽出したいデータは、  番号   2 ,い   3 ,う なのですが、どうしても、   1 ,あ   1 ,あ   2 ,い   2 ,い   2 ,い   3 ,う   3 ,う   3 ,う となってしまいます。 どうしたら良いか教えてください。 よろしくお願いします。

  • SQL削除条件について

    初歩的な質問で大変恐縮ですが、ご教授願います。 以下の二つのテーブルがある場合、1回のSQLで削除する方法を教えてください。 <Aテーブル> --------------- ID 削除フラグ A 0 B 1 C 0 D 1 E 0 E 0 E 0 F 1 F 0 F 1 G 1 G 1 G 1 <Bテーブル> ID ----- A B E F G <削除後のAテーブル> --------------- ID 削除フラグ A 0 C 0 D 1 E 0 E 0 E 0 F 1 F 0 F 1 ※Aは削除フラグが0のため削除されない。 ※C,DはIDが一致しないため削除されない。 ※E,Fは削除フラグが全て1でないため削除されない。 IDが一致していて、削除フラグが全て「1」である場合、Aテーブルを削除する。 としたいのですが、半日悩んでもうまくいきません。 どうかお願い致します。

  • 複数条件で抽出したいのですが上手くいきません

    テーブルAには「注文番号」「注文者」「金額」「発注日」「出荷日」があります。(約20000件) テーブルBには「金額」「出荷日」があります。(約500件) これら2つのテーブルから、「金額」と「出荷日」が一致するものを抽出したいのですが、 選択クエリで「金額」と「出荷日」を繋いで実行しても抽出できません。 それぞれを別に実行するとできます。ただ、「金額」も「出荷日」も同じ金額と出荷日が多数あるため、500件を遥かに越えた数字になってしまいます。 (6000件とか) それが問題でしょうか? お手数ですが、回答頂ければと思います。

  • 【SQL】他テーブルに含まれる値に合致する行を抽出

    SQL素人ですが、SQLが使えるツールからデータを抽出したく、SQL文を教えていただけますでしょうか。 ・テーブルA:会員データが格納されている(氏名、メルアド、郵便番号等が入っている) ・テーブルB:特定の郵便番号のみが入っている テーブルAのデータの中からテーブルBに入っている郵便番号に合致するメルアドを抽出したい。 何卒宜しくお願い申し上げます。

  • SQLで抽出可能でしょうか?

    SQLで抽出可能でしょうか? Javaでツールを作成しています。 開発環境はjava 1.4、oracle 10gです。 処理の中にデータベースからレコードを取得する箇所があります。 10,000件のデータを保持する社員テーブル(syain_tbl)から 社員番号(syain_no)をキーに社員名(syain_name)を取得します。 現時点で作成したSELECT句は以下のとおりです。 select syain_no, syain_name from syain_tbl where syain_no in ('0001','0002','0003') 仮に'0001'と'0003'のレコードがあり、'0002'のレコードがない場合の結果は syain_no syain_name 0001 テスト太郎 0003 テスト三郎 となります。 ですが、実現したいことは 「条件に指定した社員番号のレコードがなかったとしても、結果として取得したい」です。 つまり求めたい結果としては syain_no syain_name 0001 テスト太郎 0002 (null) 0003 テスト三郎 です。 一時表を作成して外部結合させればうまくいきそうですが、 できればDDLなしで実現させたいです。 上記のSELECT句を修正して結果を求めることは可能でしょうか? (WHERE句にある社員番号をIN条件にしている箇所は、 一度に複数件のレコードを取得したいので変更はできません)

  • タイムスタンプ型を抽出条件に指定した場合のSQL

    タイムスタンプ型を抽出条件に指定した場合、どの様なSQL文を指定すれば良いでしょうか? 該当するレコードは確かに存在していますが、以下のSQL文では「空」になってしまいました。 【実行したSQL文】 SELECT フィールド FROM テーブル WHERE タムスタンプ型フィールド BETWEEN '2011-08-05 20:00:00' AND '2011-08-06 19:59:59' 何卒、ご教授頂ければと存じます。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの問題です。

    以下のような二つのテーブルがあります。 社員テーブル 社員番号 社員氏名 1     花子 2     太郎 所属テーブル 社員番号 所属番号 1     10 1     20 2     30 欲しいのは以下の結果です。 1 花子 2 太郎 以下のSQLを実行すると、 SELECT distinct a.社員番号, a.社員氏名, b.所属番号 FROM 社員 a,所属 b where a.社員番号 = b.社員番号 order by 所属番号 1 花子 1 花子 2 太郎 となってしまいます。 先に述べたとおりの結果を取得するにはどういうSQLを書いたらいいでしょうか? お知恵を貸してください。宜しくお願いします。 Oracle8iを使用しています。