目前我正在使用AdventureWorks数据库并玩弄一些查询。我试图解决以下练习:
按产品ID订购所有产品,
这是我的疑问:
SELECT pp.ProductID, pp.Name, pps.Name FROM Production.Product pp
JOIN Production.ProductCostHistory ppch
ON pp.ProductID = ppch.ProductID
JOIN Production.ProductSubcategory pps
ON pps.ProductSubcategoryID = pp.ProductSubcategoryID
WHERE pps.Name LIKE 'Helmets' OR pps.Name LIKE 'Gloves'
AND pp.Color LIKE 'Yellow' OR pp.Color LIKE 'Blue' OR pp.Color LIKE 'Black'
GROUP BY pp.ProductID, pp.Name, pps.Name
HAVING Count(ppch.ModifiedDate) > 1
ORDER BY pp.Name ASC
这是我的结果:
现在,提出我的问题。尽管我用'AND'连接了两个条件但我收到了其他两个类别的结果,这些类别被进一步列出了匹配的颜色('Road Frames'& 'Road Bikes' )我并不安静地理解为什么。
结果不应仅显示满足两个条件的匹配吗?
我确信可能有更好的方法来实现这一点,但我对SQL很陌生,并试图获得基础知识。
我真的很感激一些帮助
答案 0 :(得分:3)
更改WHERE子句以显式指示条件组,而不是允许AND和OR的优先级确定结果。
WHERE
(pps.Name LIKE 'Helmets' OR pps.Name LIKE 'Gloves')
AND
(pp.Color LIKE 'Yellow' OR pp.Color LIKE 'Blue' OR pp.Color LIKE 'Black')
或更好
WHERE pps.Name IN('Helmets','Gloves')
AND
pp.Color IN ('Yellow','Blue','Black')