- ベストアンサー
複数レコードの完全一致を行う方法とは?
- 車名がプリウスまたはアクアであり、エアコンが2個でブレーキが1個装備されている車名を取得する方法を教えてください。
- プリウスとアクアの車名を取り出したいが、ノアは条件を満たさないため取得したくない。このような条件を満たすための方法を教えてください。
- Javaでこの処理を行う際にはデータの件数が多くなるため、行き詰まってしまっています。どのように対処すれば良いかアドバイスをいただけますか?
- みんなの回答 (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), 数量
その他の回答 (1)
- maiko0318
- ベストアンサー率21% (1483/6969)
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
お礼
すぐにご回答いただきましてありがとうございます。 そして私にはとてもわかりやすく、正直感動してしまいました。 処理が重いのかどうかはわからないのですが、 設計者の私自信が一番わかりやすいと感じたのでこのSQLを使わせていただきました。 ありがとうございました。
お礼
詳しくご説明していただきありがとうございます。 このような方法は全く想像できませんでした。 無事に今日一日を終えることができました。 大変助かりましたm(__)m