1

我有一些包含车辆信息的表格,需要选择所有具有汽油燃料变体(版本)和柴油燃料版本的模型,即排除所有版本都由汽油燃料或所有版本都由柴油燃料的所有模型。

我的设置是这样的(仅相关信息):

表模型(主键 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 则只有一种燃料的版本。

非常感谢!

4

2 回答 2

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 |
于 2013-05-24T15:10:18.180 回答
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 fiddle 对其进行了测试,它确实有效:)

于 2013-05-24T15:12:46.363 回答