1

ここにテーブルがあります

CarID| Attribute    | Value
1   | Color     | Red
2   | Color     | Blue 
3   | Color     | Red 
1   | Type      | Coupe 
2   | Type      | Hatch Back 
3   | Type      | Coupe
3   | Make      | Honda
2   | Make      | Toyota
1   | Make      | Ford

Select * From Cars WHERE (Attribute = Color AND Value = Red) AND (Attribute = Make AND Value = Honda).... のようなフィルターを実行して、CarID を 3 として取得したいと考えています。

これは 2 つのクエリの交差の単純なケースですが、単一のクエリでそれを行う方法がわかりません。

任意の助けが必要です。

4

3 に答える 3

3
select
      carid,
      count(*) matchedItems
   from
      YourTable
   where
        ( Attribute = 'Color' and Value = 'Red' )
     OR ( Attribute = 'Make' and Value = 'Honda' )
   group by 
      carid 
   having
      matchedItems = 2;

必要性を変える必要があるかもしれません...

 having count(*) = 2
于 2010-04-21T20:05:20.630 に答える
1

最も簡単な解決策は、サブクエリを使用して属性ごとに個別のテーブルをシミュレートすることです(ただし、最も効率的ではない場合があります)。

SELECT Colors.CarID FROM
    ( SELECT CarID, Value FROM Cars WHERE Attribute = 'Color' ) Colors,
    ( SELECT CarID, Value FROM Cars WHERE Attribute = 'Make' ) Makes
    WHERE Colors.CarID = Makes.CarID AND Colors.Value = 'Red' AND
        Makes.Value = 'Honda';
于 2010-04-21T20:20:09.027 に答える
0

これがクエリの別の変形です

SELECT carid
FROM AnotherUnknownTableName t INNER JOIN  
     AnotherUnknownTableName t2 ON t.carid = t2.carid AND 
                                   t.Attribute = 'Color' AND 
                                   t2.Attribute = 'Make'
WHERE 
     t.Value = 'Red' AND t2.Value = 'Honda'

(carid、Attribute)にインデックスを付けると、不思議に思うでしょう。

于 2010-04-21T20:21:02.023 に答える