• 締切済み

少し複雑な検索条件

Tom-3の回答

  • Tom-3
  • ベストアンサー率32% (42/130)
回答No.2

>「テーブルA」の「会員NO」すべての内、 >「テーブルB」の「会員NO」と一致し、かつ「生年月日」が1つも一致しない「会員NO」を拾い出したいと >考えています。 また、 >1 → 会員NOと生年月日が一致する >2 → テーブルBで会員NOが一致する2件のうち、片方の生年月日が一致する >4 → 会員NOが一致しない とありますので 抽出するデータは必ずテーブルBに存在する必要があります。 その事を考慮に入れ、まず、テーブルBとテーブルAを会員NOと生年月日でLEFT JOINし、 テーブルA.生年月日がNULLになるレコードの会員NOおよびその件数を抽出するクエリを作成します。  SELECT    BA.会員NO   ,COUNT(*) AS レコード件数  FROM テーブルB  AS BA  LEFT JOIN テーブルA AS BB  ON BA.会員NO=BB.会員NO  AND BA.生年月日=BB.生年月日  WHERE BB.生年月日 IS NULL  GROUP BY BA.会員NO これで 会員NO,レコード件数 2 ,1 3 ,2 というデータが抽出されます。 次にテーブルBが会員NO毎に何件ずつあるかを抽出します。   SELECT      BC.会員NO     ,COUNT(*) AS レコード件数   FROM テーブルB AS BC   GROUP BY BC.会員NO これで 会員NO,レコード件数 1 ,1 2 ,2 3 ,2 となります。 最後に上記で作成した2つのクエリより会員NOとレコード件数をINNER JOINで結合します。 SELECT B1.会員NO FROM(    SELECT       BA.会員NO      ,COUNT(*) AS レコード件数    FROM テーブルB AS BA    LEFT JOIN テーブルA AS BB    ON BA.会員NO=BB.会員NO    AND BA.生年月日=BB.生年月日    WHERE BB.生年月日 IS NULL    GROUP BY BA.会員NO    ) AS B1 INNER JOIN    (    SELECT       BC.会員NO      ,COUNT(*) AS レコード件数    FROM テーブルB AS BC    GROUP BY BC.会員NO    ) AS B2 ON B1.会員NO=B2.会員NO AND B1.レコード件数=B2.レコード件数 これで 会員NO,レコード件数 3 ,2 のデータのみが抽出できるようになります。 クエリを見やすいように前方のスペースは全角スペースにしています。 利用される際は全角スペースを半角スペースに変換してください。

関連するQ&A

  • 複数テーブルでの件数検索について

    Oracle上の2つのテーブルからの条件でマッチする件数をSQLで作成しています。 内容としては、テーブルAの区分=1 かつ テーブルBの種別がスペースの件数です。 テーブルAの該当するデータは10件中3件、テーブルBの該当するデータは50件中15件で、本来両方がマッチするのは2件です。 SELECT COUNT(*) FROM テーブルA,テーブルB WHERE テーブルA.区分 = '1' AND テーブルB.種別 = ' ' ; 上記のSQL文で件数をカウントしたのですが、どうも結果では30件とカウントされてしまいます。 なんとか2件として結果を出したく、参考資料を調べているところなのですが、今のところ参考になる文献が見つからず悩んでます。もし簡単にカウントできるSQLがあったり、分かる方がいれば手助けして頂きたいと思い、今回投稿しますのでご教授賜りたく思います。よろしくお願いします。

  • 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  !!!!!! 分かりづらい説明かと思いますが、よろしくお願いします。 不明点があれば、補足にて追加していきます。

  • Accessプロジェクト ストアドプロシージャによるデータ更新

    Access2003 Accessプロジェクトのストアドプロシージャでテーブルを更新する処理を作りたいのですが・・・。 内容は、テーブルAにある項目「更新区分」を "0" から "1" に更新します。ただし更新する条件として、テーブルBに登録されている、全てのロットNoと、テーブルAのロットNoが一致するものだけです。 WHERE条件に・・・  WHERE テーブルA.LotNo = テーブルB.LotNo とすると、「ADOエラー:列のプレフィックステーブルBは、テーブル名と一致しないか、クエリ内の別名と一致しません」となります。 初歩的な質問ではずかしいですが、よろしくお願いします。

  • 結合したテーブルの検索条件について。

    分からないことが出てきたので、すみませんが、教えてください。 次のような2つのテーブルを仮定します。 テーブルa  テーブルb no, title   no, aNo, delFlag  1, あえ    1, 1,  ,0 2, ああ    2, 3,  ,0 3, いう    3, 4,  ,1 4, あいあ ここで、titleに「あ」を含み、delFlagで「1」が立っていないものを検索したいのです(テーブルaのnoで、1,2を検出したい)が、 SELECT a.no AS no FROM a LEFT JOIN b ON a.no=b.aNo WHERE a.title LIKE '%あ%' and b.delFlag != 1 だと、テーブルaのno.2が検出できません。 このようなケースで、テーブルaのno1,2を選び出すことができる方法はないでしょうか? 以上、分かりにくい説明ですが、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 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 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。

  • 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削除条件について

    初歩的な質問で大変恐縮ですが、ご教授願います。 以下の二つのテーブルがある場合、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テーブルを削除する。 としたいのですが、半日悩んでもうまくいきません。 どうかお願い致します。

  • mysql 複数テーブルの条件付け摘出

    こんにちは。 初歩的なことだと思うのですが、複数テーブルからのレコード摘出で躓いてしまったのでご教授ください。 以下のような2つのテーブルがあったとして、 table_a ---------------- acount_no / name 1 / aaa 2 / bbb table_b ---------------- acount_no / value / update_at 1 / 0000 / 2012-05-12 2 / 3333 / 2012-05-12 1 / 1111 / 2012-05-13 2 / 5555 / 2012-05-13 table_aのacount_noとnameは必ず必要で、table_bのupdate_atに対応するvalueを条件付けで取り出したい場合はどのようにしたら良いのでしょうか。 レコードに存在しない日付を指定したときには、空欄で欲しいのですが・・・、 acount_no / name / value 1 / aaa / null 2 / bbb / null 例えば、 select a.acount_no,name,value from table_a as a LEFT JOIN table_b as b ON a.acount_no = b.acount_no where b.update_at = '2012-05-14' order by a.acount_no asc とすると結果が0行になってしまいます。 外部結合の使い方が間違っているのでしょうか・・・。 お力添えの程、宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • SQL、2つのテーブルで条件一致したものだけdeleteする方法は?

    オラクルSQLで質問です やりたいことは、 テーブルAから以下の条件に該当するデータを削除する。 基本的にはテーブルBの内容と比較して、一致したもの。 条件(全ての条件を満たすこと)  テーブルA.AAA = テーブルB.AAA  テーブルA.BBB = テーブルB.BBB  テーブルB.CCC > 0 調べたところ、SQLサーバでは以下のように from を2つ書いて実現できるようです。 が、今回はオラクルなので文法エラーになります。 delete FROM テーブルA FROM テーブルB where テーブルA.AAA = テーブルB.AAA AND テーブルA.BBB = テーブルB.BBB AND テーブルA.CCC > 0 ; commit; よろしくお願いします

  • SQLの検索条件について教えてください

    PL/SQLを使い始めた初心者です。 Oracleのバージョンは9iです。 検索時の条件の設定について教えてください。 例えば、2つテーブルがあるとします。 Aテーブル.TESTNoA ------------- 11111 22222 33333 44444 55555 Bテーブル.TESTNoB ------------- 11111 33333 55555 SQL発行時、 WHERE A.TESTNoA = B.TESTNoB で3件のレコードが取得できますよね。 これと同じ結果が欲しいのですが、 検索条件にテーブル型の変数(索引付表?)は使用できるのでしょうか? 変数 TestHen(0) = 11111 TestHen(1) = 33333 TestHen(2) = 55555 こんな感じで設定しておいて、この変数を利用して 一度のSQLで結果を取得したいのです。 できればLIKEを使って検索したいのですが…。 書き方がおかしかったらすみません。 どなたかお知恵をお貸しください。