我有一些包含车辆信息的表格,需要选择所有型号都有燃气的变体(版本)和柴油燃料的版本,即排除所有型号都以燃气为燃料或所有型号都加油的车型通过柴油。
我的设置就像这样(只有相关信息):
表模型(主键model_id)
model_id model
1 a model
2 b model
3 c model
4 d model
表版本(主键version_id,model_id和engine_id外键)
version_id model_id engine_id
1 1 1
2 1 2
3 2 1
4 2 3
5 3 2
6 4 3
7 3 4
8 4 5
表引擎(主键= engine_id)
engine_id fuel
1 gas
2 diesel
3 gas
4 diesel
5 diesel
我正在寻找一个可以给我模型1和4的查询,因为它们都有燃气和柴油版本,而不是2和3版本只有一种类型的燃料。
非常感谢!
答案 0 :(得分:2)
此问题称为Relation Division,这是一种方法:
SELECT
m.model_id,
m.model
FROM models As m
INNER JOIN versions AS v ON m.model_id = v.model_id
INNER JOIN engines AS e ON e.engine_id = v.engine_id
WHERE e.fuel IN('gas', 'diesel')
GROUP BY m.model_id,
m.model
HAVING COUNT(DISTINCT e.fuel) = 2
HAVING COUNT(DISTINCT e.fuel) = 2
将确保所选模型同时具有两种燃料。
请在此处查看:
这会给你:
| MODEL_ID | MODEL |
----------------------
| 1 | a model |
| 4 | d model |
答案 1 :(得分:2)
我没有对此进行测试,但您可以执行以下操作:
select model_id, model from models m where
exists (select 1 from versions v, engines e where m.model_id = v.model_id and e.engine_id = v.engine_id and e.fuel = 'gas') and
exists (select 1 from versions v, engines e where m.model_id = v.model_id and e.engine_id = v.engine_id and e.fuel = 'diesel')
编辑:我用Mahmoud Gamal提供的sql小提琴测试了它,它确实有效:)