2

在 SQL 中使用 AND 和 OR 时遇到问题。

这将返回一条记录:

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE 'Unreadable disk' 

这也返回一条记录:

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE 'Scratched CD'

但是当我这样做时:

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE 'Unreadable disk' 
OR r.Reason LIKE 'Scratched CD'

“不可读的磁盘”结果存在且正确,但“划痕 CD”不存在(对于每个不同的供应商,它具有相同的值)如果我像这样交换它们:

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE  'Scratched CD'
OR r.Reason LIKE 'Unreadable disk'

我的第一个结果是正确的('Scratched CD'),而'Unreadable disk' 为多个供应商返回相同的值。

似乎 AND OR 搞乱了查询,为什么?

4

4 回答 4

2

LIKE 旨在与 % 通配符一起使用来表示 0+ 个随机字符。

组合 AND 和 OR 时使用 (),以防止出现歧义的 where 子句

于 2012-10-18T18:49:17.683 回答
2

你的操作顺序有问题。您绝对应该使用括号来确保逻辑是已知的。它隐含的做法是:

    USE CNB_ONLINE
    SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
    FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
    WHERE (sp.SupplierID=s.SupplierID
    AND sp.ProductID=r.productID
    AND r.Reason LIKE 'Unreadable disk')
 (OR r.Reason LIKE 'Scratched CD')

你应该有这样的代码:

    USE CNB_ONLINE
    SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
    FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
    WHERE sp.SupplierID=s.SupplierID
    AND sp.ProductID=r.productID
    AND (r.Reason LIKE 'Unreadable disk' OR r.Reason LIKE 'Scratched CD')

您可以在此处找到优先顺序:http: //msdn.microsoft.com/en-us/library/ms190276.aspx,您会注意到 AND 在 OR 之前得到评估。

于 2012-10-18T18:49:50.290 回答
1

AND 优先于 OR,因此当您执行 OR 语句时,这是唯一满足的条件。因此,查询中的第二个语句将具有更宽松的标准。您需要明确地对查询进行分组,例如:

WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND (r.Reason LIKE  'Scratched CD'
OR r.Reason LIKE 'Unreadable disk')
于 2012-10-18T18:48:21.097 回答
1

当你使用 LIKE 时,你真的应该放入一些通配符,比如%. 否则,如果您正在寻找文字字符串,只需使用=.

尝试在 WHERE 子句的各个部分周围加上括号,看看是否有帮助:

AND sp.ProductID=r.productID
AND ((r.Reason = 'Scratched CD')
    OR (r.Reason = 'Unreadable disk'))
于 2012-10-18T18:48:22.377 回答