SQLでのテーブル抽出条件
- 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 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。
- snow_daruma
- お礼率100% (5/5)
- SQL Server
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いつも言っているのですが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で、 構造を意味します。論理構造が大切です。
その他の回答 (2)
- nora1962
- ベストアンサー率60% (431/717)
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 )); も。
お礼
返信が遅れて申し訳ありません。 そのようなやり方もあるのですね。 大変参考になりました。ありがとうございます。
- bin-chan
- ベストアンサー率33% (1403/4213)
実機が無いので試験してませんが。 select グループ, 社員番号 from テーブルA where グループ not in ( select distinct グループ from テーブルA inner join テーブルB on テーブルA.社員番号 = テーブルB.社員番号 ) ; で、どうでしょう?
お礼
さっそくのご回答ありがとうございます。 私も実機がないため、明日早急に試させて頂きます。
関連する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> 会社コード* 部門コード* *は主キー よろしくお願い致します。
- ベストアンサー
- Oracle
- 場合によって条件を変える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を教えていただけないでしょうか。 よろしくお願いいたします。
- 締切済み
- Oracle
- 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 Server
- 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 ・ ・ ・ ご教授宜しくお願い致します。
- ベストアンサー
- Oracle
- 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で教えていただければ幸いでございます。 お手数お掛けしますが、何とぞ宜しくお願い致します。
- ベストアンサー
- その他MS Office製品
- 簡単なSQLに関して
初歩的なSQLの質問で申し訳ありません。 教えて下さい。 下記のような、ある2つの異なる名前の同項目のテーブルが存在します。 《テーブル》 Aテーブル 社員番号、日付、内容 Bテーブル 社員番号、日付、内容 ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 どのようなSQLを書けば良いでしょうか?? 尚、テーブルに関しては、諸事情であえて2つに分けてあります。 よろしくお願いします。
- ベストアンサー
- Oracle
- 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初心者のため、 どうかご回答いただきたいと思います。 よろしくお願いします!!
- ベストアンサー
- SQL Server
お礼
ご丁寧に回答頂きましてありがとうございます。 論理的に組み立てができるように精進したいと思います。