複数レコードの完全一致を行う方法とは?

このQ&Aのポイント
  • 車名がプリウスまたはアクアであり、エアコンが2個でブレーキが1個装備されている車名を取得する方法を教えてください。
  • プリウスとアクアの車名を取り出したいが、ノアは条件を満たさないため取得したくない。このような条件を満たすための方法を教えてください。
  • Javaでこの処理を行う際にはデータの件数が多くなるため、行き詰まってしまっています。どのように対処すれば良いかアドバイスをいただけますか?
回答を見る
  • ベストアンサー

複数レコードの完全一致

日本語でどう説明すればもわからないのでタイトルも意味不明ですが 以下のテーブルからプリウスとアクアだけを取り出したいのです。 ○自動車テーブル○ 車名(PK), 連番(PK), 装備,  数量 --------------------------------- プリウス,   1,  エアコン,  2 プリウス,   2,  ブレーキ,  1 アクア ,   1,  ブレーキ,  1 アクア ,   2,  エアコン,  2 レクサス,   1,   テレビ,  3 レクサス,   2,   ビデオ,  2 ノア   ,   1,  ブレーキ,  1 ノア   ,   2,    テレビ,  1 ○取得したい結果○ 車名 -------- プリウス アクア エアコン2個、且つブレーキ1個が装備されている車名を取得したいのです。 ブレーキ1個が装備されているだけのノアはエアコン2個という条件が満たされていないので取得したくありません。 そもそもこのようなことが可能なのかもわからないのですがjava側で処理をするには件数があまりに膨大なので行き詰まっています。 明日、職場からチェックさせていただきます。 お礼は夜になってしまいますが何卒よろしくお願いします。

  • Oracle
  • 回答数2
  • ありがとう数15

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

まず、条件をなるべく素直に書くと↓のようなSQLになりました。 SELECT DISTINCT 車名 FROM 自動車 a WHERE EXISTS ( SELECT * FROM 自動車 b WHERE a.車名 = b.車名 AND 装備 = 'エアコン' AND 数量 = 2 ) AND EXISTS ( SELECT * FROM 自動車 c WHERE a.車名 = c.車名 AND 装備 = 'ブレーキ' AND 数量 = 1 ) ; WHERE句でサブクエリーを使って、条件にマッチする行の存在をチェックしています。 これでは、ちょっと冗長な感じがするのでGROUP BYとHAVINGを使って書き直すと下記の様になりました。 SELECT 車名 FROM 自動車 GROUP BY 車名 HAVING SUM(CASE WHEN 装備 = 'エアコン' AND 数量 = 2 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN 装備 = 'ブレーキ' AND 数量 = 1 THEN 1 ELSE 0 END) > 0 ; HAVING句内で集約関数とCASE式を組み合わせる事によって、1番目のSQLと同様の存在チェックを行っています。 蛇足ですが、車種も装備も同一の行が複数有ると思えませんので、連番の行は冗長かと思います。 下記の様に車名と装備の組が主キーとなっても良さそうに見えます。 車名(PK), 装備(PK), 数量

参考URL:
http://codezine.jp/article/detail/652
bennkyoutyuu1
質問者

お礼

詳しくご説明していただきありがとうございます。 このような方法は全く想像できませんでした。 無事に今日一日を終えることができました。 大変助かりましたm(__)m

その他の回答 (1)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

select name from (select name as name from hoge where soubi='エアコン' and suu=2 union all select name as name FROM hoge where soubi='ブレーキ' and suu=1) group by name having count(*)=2

bennkyoutyuu1
質問者

お礼

すぐにご回答いただきましてありがとうございます。 そして私にはとてもわかりやすく、正直感動してしまいました。 処理が重いのかどうかはわからないのですが、 設計者の私自信が一番わかりやすいと感じたのでこのSQLを使わせていただきました。 ありがとうございました。

関連するQ&A

  • これをSQLでやることは可能ですか?

    すいません。どうしても閃かないので教えてください。 まず、テーブルは 連番  PK コード 日付 となっています。 その中のデータは 連番  コード   日付 -----+--------+--------- 1   |   001 | 2002/01 2   |   001 | 2002/02 3   |   002 | 2002/03 4   |   002 | 2002/04 5   |   003 | 2002/05 -----+--------+--------- となっています。 このデータの中から 「コード毎に日付が一番新しい連番」を取得したいのですが可能でしょうか? 結果は 連番   コード   日付 -----+--------+--------- 2   |   001 | 2002/02 4   |   002 | 2002/04 5   |   003 | 2002/05 -----+--------+--------- となって欲しいのですが・・・ どなたかこれを実現するSQLを教えてください。 お願いします。

  • 【Excel】要素数が不定な場合のGETPIVOTDATAの使い方を教

    【Excel】要素数が不定な場合のGETPIVOTDATAの使い方を教えてください。 Excel 2003で添付画像のようなサンプルデータを作成しています。 以下の4つのテーブルがあります。 ・テーブル(1):受注データ  (条件)   ・品名,メーカーは必須   ・メーカーの要素数は不定   ・タイプは空白の場合もあり    品名  |メーカー |タイプ | 数量  -------------------------------------------  テレビ   |  A  | 1   | 1  スピーカー |  D  |    | 2  テレビ   |  C  |    | 3  エアコン  |  A  | 1   | 4  スピーカー |  A  |    | 1  テレビ   |  B  |    | 2  エアコン  |  A  | 1   | 3  テレビ   |  A  | 1   | 4  テレビ   |  A  | 2   | 1  スピーカー |  A  |    | 2   ・テーブル(2):価格データ  メーカー |  品名    | タイプ | 価格  --------------------------------------------------    A  |  エアコン  |  1  | 100,000    A  |  スピーカー |     | 10,000    A  |  テレビ   |  1  | 100,000    A  |  テレビ   |  2  | 70,000    A  |  テレビ   |  3  | 50,000    B  |  テレビ   |     | 50,000    C  |  テレビ   |     | 120,000    D  |  スピーカー |     | 7,000 ・テーブル(3):テレビの合計受注数量,価格  メーカー | タイプ| 単価   | 合計数量 |  小計   ----------------------------------------------------------------    A  |  1  | 100,000  |  5    |  500,000    A  |  2  | 70,000  |  1    |  70,000    B  |     | 50,000  |  2    |  100,000    C  |     | 120,000  |  3    |  360,000   ・ピボットテーブル:受注データの集計  -------------------------------------------------------  合計 / 数量  -------------------------------------------------------    品名  | メーカー |  タイプ  |  集計  -------------------------------------------------------  エアコン  |  A    |  1     |  7  スピーカー |  A    |  (空白)  |  3        |  D    |  (空白)  |  2  テレビ   |  A    |  1     |  5        |      |  2     |  1        |  B    |  (空白)  |  2        |  C    |  (空白)  |  3  -------------------------------------------------------    総計  |      |       |  23 価格データおよびピボットテーブルから、テーブル(3)を生成したいのですが、ピボットテーブルからの値の抽出に苦戦しています。 受注合計数はピボットテーブルから以下のような数式で取り出しています。  =GETPIVOTDATA("合計 / 数量",F1,"品名","テレビ","メーカー","A","タイプ",1) しかし品名,メーカー,タイプを1つ1つ手入力しているため、ピボットテーブルの要素数が増えた場合に動的に対応できません。   ※新たにメーカーAのタイプ3の受注が入った場合など このように要素数が不定なピボットテーブルから、テレビの行をすべて抽出するにはどうすればよいでしょうか? なお、テーブル(2)は実際には莫大な行数なので、テーブル(2)から全メーカー/タイプのテレビを拾い上げるわけにはいきません。 つたない文章でわかりづらいかと思いますが、ご教示お願いいたします。

  • レコードの一致方法

    テーブルA(マスター) [コード]、[商品名]        ○○○、△△△ テーブルB [コード]、[商品名]       ○○○、△△△ テーブルC [コード]、[商品名]       ×××、△△△ 以上のように、3つのテーブルの不一致クエリーなどを 抽出する場合、テーブルAとB同士の場合は、一致しないのはコードを結合線で結べば、すぐに出てきますが、テーブルAとCの比較の場合は、コードを結合線で結んだところで、違うのでうまくできません。 商品名は△△△なので、コードが違っていても、商品名はあっているので、不一致ではなく、一致しているというように考えたいのです。 △△△についてのコードは×××、○○○というように2つ以上持っているような感じですれば、うまくいくとおもっているのですが、こういう場合はテーブルAにコードのフィールドを2つ作っておいて、結合線でつなぐときに切り替えてするしかないのでしょうか? テーブルA(マスター)で、このような、2つのコードを持っているとおもわれる商品はレコード100以上あって、それをそれぞれ選びながら入力していかないかとおもうと、大変な作業化とおもっているのですが、アドバイスあればお願いします。

  • 一致するレコードを削除したい。

    質問します。ACCESS(office2000)を使って下記の様に実行したいのですが。 テーブルA         テーブルB 商品名、 管理番号    単価、 管理番号 パソコンA   101      \1,200  112 パソコンB  102       \1,300  102 パソコンC  103      \1,500  123           ↓ テーブルA 商品名、  管理番号 パソコンA  101 パソコンC  103 削除クエリを実行して管理番号が一致するレコードをテーブルAから削除したいのですが、削除クエリどうやって設定すればいいのでしょうか。どうかご教授をお願い致します。

  • 複数のレコードを一つにするには

    いつもお世話になっています。 複数のレコードを一つのレコードにに変換するにはどのようにすればよいでしょうか? ID|Name -------- 1|yamada 2|sato 3|suzuki ↓ ID|Name|ID|Name|ID|Name| ------------------------- 1|yamada|2|sato|3|suzuki|

  • 同一レコードを複数取り出したい

    以下のようなテーブルがあったとます。 <AA table> A B ------ 01 2 02 3 03 4 A = '01'のレコードを取り出す場合には、 select * from AA where A = '01'; A B ------ 01 2 で取れますが、このときBの値を判断して、以下のようにBの数だけ同一レコードを取り出したいと思います (where A = '01'ならば) A B ------ 01 2 01 2 (where A = '03'ならば) A B ------ 03 3 03 3 03 3 03 3 このように、同一レコードを条件によって複数取り出す処理をSQLで記述することはできるのでしょうか?

  • 複数レコードを1つにまとめる

    いつもお世話になっております。(Access2016使用) 複数レコードを1つにまとめたいと思っております。 https://jamfunk.jp/wp/?page_id=1660 上記のHPを参考にクエリ2に以下の式を作ったのですが、添付のエラーメッセージが表示されてしまいます。 どのようにしたらよろしいでしょうか? expr1: dbselect("SELECT FileName FROM クエリ1 WHERE 1 ORDER BY ソートキー;",",") 【データ元】 クエリ名:クエリ1 フィールド名:FileName s1 h1 STPVNVSH こんな感じでデータを表示したいです → s1h1STPVNVSH

  • 複数の同一レコードをまとめたい

    No 商品コード カラー サイズ 入荷日 在庫数 1     100     1     M     2008/01/01     1 2     100     1     M     2008/02/02     2 3     101     2     L     2008/01/01     1 4     101     2     L     2008/02/02     1 5     101     2     L     2008/03/03     1 6     102     1     L     2008/01/01     2 7     103     1     M     2008/02/02     1 上のような検索結果を得たのですが、 商品コード、カラー、サイズの値が同じ時には レコードを下のように、一行で表示させたいと思っております。 どのような文を書いたらよろしいでしょうか? No 商品コード カラー サイズ 入荷日 在庫数 1 100 1 M 2008/01/01 2 3 101 2 L 2008/01/01 3 6 102 1 L 2008/01/01 2 7 103 1 M 2008/02/02 1 初心者で質問の仕方もままならないので 非常にわかりにくい質問だと思いますが、 ご教授いただけたらうれしいです。 ちなみに、JBUILDERで作業しております。

    • ベストアンサー
    • Java
  • アクセスで複数レコードを1レコードにできますか?

    アクセスで複数レコードを1レコードにできますか? お世話になります。 お教えください。 以下のようなレコード(テーブル)があります。 氏名 日付  金額 aaa 5/12 200 aaa 5/24 500 bbb 5/01 300 ccc 5/04 100 これを aaa 5/12 200 5/24 500 bbb 5/01 300 ccc 5/04 100 のようにデータを表示(クエリで)したいのですが どのようにしたらいいでしょうか?

  • 複数のレコードを1つのレコードにまとめる方法

    いつもお世話になりますm(__)m Access2003で、以下のテーブルがあるとします。 例)tableA 項目1|項目2 --------- 部署1|あいうえお 部署2|かきくけこ 部署1|さしすせそ 部署1|たちつてと 部署2|なにぬねの 上記のテーブルの項目1が同じものを、別テーブルの1つのフィールドにスペースでまとめたいと思っています。 例)結果テーブル 項目1|項目3 --------- 部署1|あいうえお さしすせそ たちつてと 部署2|かきくけこ なにぬねの 可能であればクエリで処理したいのですが、無理でしたらVBA他でも結構です。 お詳しい方、ご教授のほど宜しくお願い致しますm(__)m