我是SQL新手所以请耐心等待。我试图只选择具有特定产品代码的行。当我在没有OR语句的情况下运行它进行一次选择时,查询结果很好,但是一旦我用OR语句添加另一个选项,结果就不准确了。看起来它一直在针对每个OrderID放置ProductCode MW-BShorts-0009。
SELECT
Orders.OrderID, OrderDetails.ProductCode
FROM
Orders, OrderDetails
WHERE
Orders.OrderID = OrderDetails.OrderID
AND OrderDetails.ProductCode = 'MacFRC'
OR OrderDetails.ProductCode = 'MW-BShorts-0009'
答案 0 :(得分:1)
使用IN子句,最好使用Join代替Cartesian product
SELECT Orders.OrderID, OrderDetails.ProductCode
FROM Orders
JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
AND OrderDetails.ProductCode IN ('MacFRC','MW-BShorts-0009')
答案 1 :(得分:1)
从您的上述查询看起来您甚至不需要加入或从订单表中选择
select OrderID, ProductCode
from OrderDetails
where ProductCode IN ('MacFRC','MW-BShorts-0009')
答案 2 :(得分:1)
AND
优先于OR
,因此您需要将OR
子句括在括号中:
SELECT Orders.OrderID, OrderDetails.ProductCode
FROM Orders, OrderDetails
WHERE Orders.OrderID = OrderDetails.OrderID
AND
(OrderDetails.ProductCode = 'MacFRC'
OR OrderDetails.ProductCode = 'MW-BShorts-0009')
但是,您应该使用JOIN
子句而不是添加WHERE
条件来匹配表格,并且可以使用IN
而不是OR
两个条件:
SELECT Orders.OrderID, OrderDetails.ProductCode
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
WHERE OrderDetails.ProductCode IN ('MacFRC', 'MW-BShorts-0009')
答案 3 :(得分:1)
你可以像Srikanth所提到的那样使用IN。但是你也需要理解operator precedence的概念。在您的情况下,您说" Orders.OrderID必须等于OrderDetails.OrderID和OrderDetails.ProductCode必须等于' MacFRC'或者OrderDetails.ProductCode必须等于' MW-BShorts-0009& #39;"您想要的是OrderID = ProductCode标准应用于ProductCode。
您需要做的就是用括号覆盖默认优先级,就像在乘法之前想要添加一样。像这样:
SELECT Orders.OrderID, OrderDetails.ProductCode
FROM Orders, OrderDetails
WHERE Orders.OrderID = OrderDetails.OrderID
AND (OrderDetails.ProductCode = 'MacFRC'
OR OrderDetails.ProductCode = 'MW-BShorts-0009')