SQLでのテーブル抽出条件

このQ&Aのポイント
  • SQL初心者のため、テーブル抽出の条件について教えてください。
  • テーブルAとテーブルBがあり、テーブルBの社員番号と一致する場合にテーブルAを抽出しない方法を教えてください。
  • 上記のテーブルAとテーブルBの例で、テーブルBの社員番号と一致する場合に抽出しないテーブルAの結果を示してください。
回答を見る
  • ベストアンサー

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 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

いつも言っているのですが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で、 構造を意味します。論理構造が大切です。

snow_daruma
質問者

お礼

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

その他の回答 (2)

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

snow_daruma
質問者

お礼

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

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

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

snow_daruma
質問者

お礼

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

関連するQ&A

  • SQLにて順列の抽出

    MySQLにてSELECT文にて順列の抽出をしようと試みていますが、順列を出すためのSQL文がわからず困っています。 TABLE1 +-----+-----+-----+-----+ | NUM | A | B | C | +-----+-----+-----+-----+ | 101 | 0 | 4 | 9 | +-----+-----+-----+-----+ | 102 | 2 | 2 | 0 | +-----+-----+-----+-----+ 例えば上記の様なテーブルがあって、NUM=101のA,B,Cを取り出して 049 094 409 490 904 940 のような順列を作り出してPHPから渡した変数D(仮にvar=409)と照らし合わせようと試みていますが、1つの行の中の数字で順列を抽出するSQL文がわからず困っていますので、ご教授願います。

    • ベストアンサー
    • MySQL
  • SQLで質問があります。

    すみません。初めて質問させて頂きます。 以下のような条件のSQL生成は可能でしょうか。 可能な場合どのようなSQLになるかご教授頂けないでしょうか。 <条件> テーブルA,B,Cで一致する社員コード AND テーブルAの年月日がnull AND テーブルBの区分コードが"01"以外 AND テーブルCの部門コードでテーブルDを検索し 取得した会社コードが"00001" <取得したい項目> テーブルA.社員コード テーブルA.社員氏名 テーブルC.区分コード <テーブルA> 社員コード* 会社コード 年月日 社員氏名 <テーブルB> 社員コード* 会社コード 区分コード <テーブルC> 社員コード* 会社コード 部門コード <テーブルD> 会社コード* 部門コード* *は主キー よろしくお願い致します。

  • 場合によって条件を変える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を教えていただけないでしょうか。 よろしくお願いいたします。

  • 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テーブルを削除する。 としたいのですが、半日悩んでもうまくいきません。 どうかお願い致します。

  • 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について

    複数のSQL条件を設定する方法について以下の内容 を実現したいと思っています (1)番号が17000以上 (2)そのなかで番号がMINの値を持ってくる TBL 作業 品目  番号     日時    数量 A    15010   05/23  20 A    15020 05/24  20 A    17010   05/25  20←ーー抽出 A    17030   05/26  20 A    17080   05/27  20 B      ・       ・     ・ C      ・       ・     ・ D      ・       ・     ・ ご教授宜しくお願い致します。

  • Access2003 複雑な条件のデータ抽出

    ☆1つのテーブルで、フィールド[A]~[C]があり、文字および英数字のデータが混在しています。 (ただし、フィールド[C]には、空欄(Null)になっている場合があります) =========================================================== (テーブル(1)) No  [A]      [B]    [C]     [D]      [E]      [F] 1   111      X    あ       2   222      X     か   3   333      X     さ  4   111      Y    た 5   222      Y   (Null)  6   333      Y     は 7   222      Z     ま   8   333      Z     や  9   111      Z    ら    =========================================================== [課題] (1) テーブル(1)のフィールド[A]の値を参照し、「111」の場合は、   フィールド[C]の値を[D]へ抽出する([B]でグループ化) (2) 同様に、フィールド[A]の値を参照し、「222」の場合は、   フィールド[C]の値を[E]へ抽出する([B]でグループ化) (3) 同様に、フィールド[A]の値を参照し、「333」の場合は、   フィールド[C]の値を[F]へ抽出する([B]でグループ化) (4) 新規クエリにて、上記課題(1)~(3)の条件を指定して実行すると    以下の抽出結果が表示される =========================================================== [抽出結果] (テーブル(2)) No  [B]    [D]    [E]      [F] 1   X     あ    か      さ     2   Y     た   (Null)    は   3   Z     ら    ま     や =========================================================== 別々のレコードにあるフィールド[C]の値を、条件に従い テーブル(2)のように1つのレコードにまとめたいのです。  大変恐縮ですが、私はSQLが書けないので、フィールド欄へ関数式を 入力して条件を指定しております。 できましたら、各フィールドへ入力する関数式を教えていただけると助かります。 また、関数だけでは出来ない場合は、SQLで教えていただければ幸いでございます。 お手数お掛けしますが、何とぞ宜しくお願い致します。

  • 簡単なSQLに関して

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

  • SQLの質問

    初歩的な質問ですみません。 テーブル foo に以下のような一列があったとします。 colA -- a a a a b b c c c この中からcolAでグループ化したcountが最大のものを抽出するSQLっどう書けばよいのでしょうか (この例では a がセレクトされる結果をなります)。 できる限り一般的な方法でお願いします。

  • SQL

    以下のようなテーブルがあり、 区分に2、3、4があれば抽出しないという SQL文を教えていただければと思います。 (SQLSERVER2000を使用しています) 名称    | 区分 テストa |  1 テストa |  1  テストa |  2 テストb |  1 テストb |  1 テストc |  1 テストc |  2 テストc |  3 テストc |  4 テストc |  5 テストd |  1 テストd |  1 テストd |  5 テストd |  5 テストd |  5 例でいくとテストaは区分が1、1、2で 2がはいっているので抽出しない。 テストbは1、1なので抽出する。 テストcは1、2、3、4、5で2、3、4がはいっている ので抽出しない。 テストdは1、1、5、5、5なので抽出する。 つまり結果としては テストaとテストdが抽出されるということです。 質問もままならないほどSQL初心者のため、 どうかご回答いただきたいと思います。 よろしくお願いします!!