使用LIKE时SQL查询未显示正确的结果

时间:2019-08-20 08:42:06

标签: sql sql-server

我正在使用Microsoft SQL Server Management Studio 2018进行查询,并且试图获取每个订单的'腔'零件类型总数,并且我注意到1个订单有些异常。我99%的确定它已经正确添加到SQL数据库中,因为每个订单都是首先在Access中创建的,并且此订单的.mdb文件仅包含40个“腔”部分。但是,当我运行SQL查询时,我总共得到248个248部分。

到目前为止,我尝试使用代码,不同的联接,在SELECT和GROUP BY子句中删除/添加不同的列,并且仅使用NOT LIKE方法过滤掉部分会有所帮助。

以下代码(用于显示差异的2个订单)返回2列和2行(按预期):

SELECT OrderNo, SUM(Quantity) FROM Orders

INNER JOIN Heading ON Orders.OrderID = Heading.OrderID

WHERE ComponentType LIKE 'Cavity' AND OrderNo LIKE '73966' OR OrderNo LIKE '73967'

GROUP BY OrderNo, Quantity

但是,我得到的命令73966有40个腔体零件(正确),而命令73967有248个零件(不正确)。

当我尝试更改查询并添加ComponentType(到SELECT和GROUP BY)时,这就是我得到的:

Order | Quantity | ComponentType
73966    40       Cavity
73967    16       
73967    60       Bead type
73967    40       Cavity
73967    8        Cill
73967    42       Frame
73967    48       Sash
etc...      

添加以下内容有助于过滤掉不需要的组件,但我认为没有必要获得正确的结果,因为将来添加任何其他内容都将迫使我更新查询。

 WHERE (...) AND ComponentType NOT LIKE '%Bead type%'

我认为值得一提的是,这两个订单具有相同的组件类型(珠子类型,空腔,填充),并且只是订单号73967不能正确显示。有什么想法为什么我需要手动过滤此订单的所有其他零件类型,而不是用SQL为我做呢?

1 个答案:

答案 0 :(得分:2)

您使用错误的OR子句。需要使用()检查两个OR条件

SELECT OrderNo, SUM(Quantity) FROM Orders
INNER JOIN Heading ON Orders.OrderID = Heading.OrderID
WHERE ComponentType =  'Cavity' 
AND  ( OrderNo = '73966' OR OrderNo = '73967')
GROUP BY OrderNo

并且您不应该在分组依据中使用聚合函数(数量)中的列(以这种方式求和失败

无论如何,如果不使用通配符,则应使用=而不是

SELECT OrderNo, SUM(Quantity) FROM Orders
INNER JOIN Heading ON Orders.OrderID = Heading.OrderID
WHERE ComponentType =  'Cavity' 
AND   OrderNo IN( '73966','73967')
GROUP BY OrderNo

或根据建议,您可以使用IN子句代替几个OR

{{1}}