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 のオーダー ラインのインスタンスは必要ありません。オーダーは複数の行に分割され、それぞれが複数の行に分割されます。行には、複数のパッケージを添付できます。以下は、正しく機能するクエリです。

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 であるため無効です。条件の順序に問題があるように見えますか? これらの条件をいじってみましたが、望む結果が得られません。これは 2 つの個別のクエリと UNION ステートメントで実行できることはわかっていますが、このシナリオで 1 つのクエリだけで複数の条件を実行する方法はありますか? ありがとう。

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)は評価されたためです。ご覧のとおり、exists ステートメントは 2 番目のチェックにリンクされていました。

于 2013-06-17T13:29:36.240 に答える