sql - 排除多个条件的SQL查询结果-单表

标签 sql sql-server

我在之前提出的另一个问题中使用的查询遇到了问题。我不想添加这个问题,所以我只是开始一个新的问题。此场景适用于 SQL Server 2008。

Order Number    Order Line    Package    Part Number    Size    Cost    Reviewed
   0001              1           1           A1          S      22.5      Yes
   0001              1           1           B2          M      33.1      Yes
   0001              1           1           C3          L      11.2      Yes
   0001              1           2           A1          XL     15.0      Yes
   0001              1           3           A2          M      12.0      Yes
   0001              2           1           D1          S      42.9      Yes
   0002              1           1           B4          L      72.5      No
   0002              1           2           A7         XXL     66.7      No
   0002              2           1           C1          XL     11.8      Yes
   0002              2           1           B1          S      22.3      Yes
   0003              1           1           A1          L      55.2      Yes

我想选择订单号、订单行和包装。我必须按零件号、尺寸、成本以及是否经过审查进行搜索。这个表有大约30,000个订单,所以会有多个结果(这就是我想要的)。我必须排除具有包 <> 1 的订单行的结果。换句话说,如果订单行具有包 <> 1,我不想要订单行的实例。一个订单被分成几行,每行行可以附加多个包。下面是正确运行的查询。

SELECT
   ORDERNumber,
   ORDERLine,
   Package
FROM
   orders a
WHERE  NOT EXISTS (SELECT *
                     FROM orders AS b
                    WHERE a.ordernumber = b.ordernumber
                          AND a.orderline = b.orderline
                          AND b.Package <> 1)
GROUP BY
ORDERNumber,
   ORDERLine,
   Package 

这是上面示例查询的结果(正确满足我的要求)...

ORDERNUMBER     ORDERLINE     PACKAGE 
0001            2             1 
0002            2             1 
0003            1             1 

当我尝试添加多个条件时,出现了我遇到的问题。例如...

SELECT
   ORDERNumber,
   ORDERLine,
   Package
FROM
   orders a
WHERE (REVIEWED = 'Yes' AND SIZE = 'L') OR (REVIEWED = 'Yes' AND SIZE = 'S')
AND  NOT EXISTS (SELECT *
                     FROM orders AS b
                    WHERE a.ordernumber = b.ordernumber
                          AND a.orderline = b.orderline
                          AND b.Package <> 1)
GROUP BY
ORDERNumber,
   ORDERLine,
   Package

给我以下结果(不符合我的要求)...

ORDERNUMBER     ORDERLINE     PACKAGE 
0001            1             1 
0001            2             1 
0002            2             1 
0003            1             1 

订单号 0001,订单行 1 无效,因为它的包装值为 2 和 3。看来我的条件顺序有问题?我尝试过使用这些条件,但没有得到我想要的结果。我知道这可以通过两个单独的查询和一个 UNION 语句来完成,但是有没有一种方法可以在这种情况下仅用一个查询来执行多个条件?谢谢。

最佳答案

更改您的查询并在 OR 之间添加括号参数:

((REVIEWED = 'Yes' AND SIZE = 'L') OR (REVIEWED = 'Yes' AND SIZE = 'S'))

完整的查询如下所示:

SELECT
   ORDERNumber,
   ORDERLine,
   Package
FROM
   orders a
WHERE ((REVIEWED = 'Yes' AND SIZE = 'L') OR (REVIEWED = 'Yes' AND SIZE = 'S'))
      AND  NOT EXISTS (SELECT *
                       FROM orders AS b
                       WHERE a.ordernumber = b.ordernumber
                             AND a.orderline = b.orderline
                             AND b.Package <> 1)
GROUP BY
         ORDERNumber,
         ORDERLine,
         Package

因为您的原始查询首先被评估(REVIEWED = 'Yes' AND SIZE = 'L')如果不匹配则 (REVIEWED = 'Yes' AND SIZE = 'S')) AND NOT EXISTS (SELECT * FROM orders AS b WHERE a.ordernumber = b.ordernumber AND a.orderline = b.orderline AND b.Package <> 1)被评价。正如您所看到的,您的存在语句与第二次检查相关联。

关于sql - 排除多个条件的SQL查询结果-单表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17148598/

相关文章:

MySQL - 查询输出合并数据

sql-server - 如何在 SQL fiddle 查询中使用局部变量

sql - 强制 SQL Remote 查询进行远程过滤而不是本地过滤

sql - 将多行数据合并到一行中

sql-server - Amazon RDS SQL Server 更改数据库所有者

sql - 如何在左连接分支内强制连接?

sql - WHERE 子句中的多个条件

mysql - 为什么 MySQL 对简单查询的计数不正确?

sql-server - 包含数据的示例 Employee SQL Server 数据库

sql - isnull 与 is null