【问题标题】:SQL query not showing the right result when using LIKE使用 LIKE 时 SQL 查询未显示正确的结果
【发布时间】:2019-08-20 08:42:06
【问题描述】:

我正在使用 Microsoft SQL Server Management Studio 2018 进行查询,我正在尝试获取每个订单的“Cavity”零件类型的总量,我注意到 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%'

我认为值得一提的是,两个订单具有相同的组件类型(Bead type、Cavity、Cill),只是订单号 73967 没有正确显示。有什么想法为什么我需要手动过滤此订单的所有其他零件类型而不是 SQL 为我过滤?

【问题讨论】:

  • Orderno 是字符列吗?为什么?
  • WHERE ComponentType LIKE 'Cavity' AND OrderNo IN ('73966', '73967')
  • 为什么要OrderNo LIKE '73966'?为什么不OrderNo = 73966
  • 另外,你为什么要在Quantity 上执行SUM 并对其进行分组?
  • 似乎您以错误的方式使用 OR 子句尝试使用 WHERE ComponentType LIKE 'Cavity' AND (OrderNo LIKE '73966' OR OrderNo LIKE '73967') .. 或如上面建议的那样使用 IN 子句

标签: sql sql-server


【解决方案1】:

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

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

并且您不应该在 group by 中使用聚合函数 (quantity) 中的列(这样总和失败

无论如何,如果不使用wildchar,那么你应该使用= 而不是喜欢

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

或者按照建议,您可以使用 IN 子句代替几个 OR

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

【讨论】:

  • 我建议将LIKE= 更改为OrderNo,而ComponentType LIKE 并没有太大作用,因为没有通配符。这个答案解决了OR 问题,但保留了围绕LIKE 和字符串数据类型的所有混淆
  • @Nick.McDermaid 正确答案更新为 = 而不是当数学字符串不包含通配符 ..
  • 你也可以用IN ('73966', '73967')代替OR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
相关资源
最近更新 更多