从每行的列中选择多个选定值

时间:2014-10-22 19:36:06

标签: sql

我是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'

4 个答案:

答案 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')