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 个查询相交的简单案例,但我不知道如何在单个查询中完成。

任何帮助appriciated。

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 回答