0

多くの試みの後、私はこれに失敗し、誰かが助けてくれることを願っています. このクエリは、アイテムが工場で製造されたときにユーザーが作成したすべてのエントリと注文番号を返します。例えば

Order Number   Entry type  Quantity
3000          1           1000
3000          1           500
3000          2           300
3000          2           100
4000          2           1000
5000          1           1000

私がクエリにやりたいことは、このような結果をフィルタリングして返すことです

注文番号にエントリタイプ 1 および 2がある場合、タイプ 1の行のみが返されます。それ以外の場合は、その注文番号のタイプが何であれ、行が返されます。

したがって、上記は次のようになります。

Order Number   Entry type  Quantity
3000          1           1000
3000          1           500
4000          2           1000
5000          1           1000

現在、私のクエリ (DB2、非常に基本的な用語ではこのように見えます) は、変更要求が届くまでは正しかったです!

type=1 または type=2 の予約から * を選択

ありがとう!

4

2 に答える 2

0

共通テーブル式」 [CTE] は、多くの場合、ロジックを簡素化できます。これは、複雑な問題を概念的なステップに分割する方法と考えることができます。以下の例では、g を CTE の結果セットの名前と考えることができます。

    WITH g as
    ( SELECT order_number, min(type) as low_type
        FROM bookings
        GROUP BY order_number
    )
    SELECT b.*
      FROM g 
      JOIN bookings b   ON  g.order_number = b.order_number
                        AND g.low_type     = b.type

JOIN ON 条件は、両方のタイプが存在する場合に low_type が 1 になり、そのタイプのレコードのみが選択されるように機能します。タイプが 1 つしかない場合は、low_type と同じになります。

1 と 2 が予約テーブルで許可されている唯一のタイプである限り、これは正常に機能するはずです。そうでない場合は、CTE と外側の SELECT に WHERE 句を追加するだけです。

于 2013-04-25T22:32:45.787 に答える
0
select * from bookings
    left outer join (
       select order_number,
          max(case when type=1 then 1 else 0 end) + 
             max(case when type=2 then 1 else 0 end) as type_1_and_2
          from bookings
          group by order_number
    ) has_1_and_2 on 
       type_1_and_2 = 2
       has_1_and_2.order_number = bookings.order_number
    where 
        bookings.type = 1 or 
        has_1_and_2.order_number is null

タイプ 1 とタイプ 2 の両方を持つオーダーをすべて見つけて結合します。

行が結合に一致した場合、タイプが 1 の場合にのみそれを返します。行が結合に一致しなかった場合 ( has_type_2.order_number is null)、タイプに関係なくそれを返します。

于 2013-04-25T12:06:52.563 に答える