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 はどちらもガソリン バージョンとディーゼル バージョンがあるため、1 種類の燃料のみのバージョンを持つモデル 2 と 3 とは対照的に、クエリを探しています。

どうもありがとう!

4

2 に答える 2

2

この問題はRelation Divisionと呼ばれ、これを行う 1 つの方法を次に示します。

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により、選択したモデルに 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フィドルでテストしましたが、うまくいきました:)

于 2013-05-24T15:12:46.363 に答える