2

我在使用之前提出的另一个问题的查询时遇到了问题。我不想添加这个问题,所以我只是开始一个新问题。此方案适用于 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,我不想要它。订单被分成几行,每行row 可以附加多个包。下面是正常工作的查询。

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 语句来完成,但是有没有一种方法可以在这种情况下只用一个查询来完成多个条件?谢谢。

4

1 回答 1

4

更改查询并在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)被评估。如您所见,您的存在语句与第二次检查相关联。

于 2013-06-17T13:29:36.240 回答