1

これは単純でなければなりません。

ORDERS と ORDER_LINES の 2 つのテーブルがあります。非常に単純で一目瞭然です。これは 1 対多の関係です。ORDER_LINES には、その特定の行が完了した日付を含む FULFILLED 列があります。

私がしなければならないことは次のとおりです。完了した注文のすべての ORDERS.ID を選択します。つまり、ORDER_LINES テーブルの FULFILLED 列は、その特定の注文に対して NULL ではありません。

例:

オーダー #1 には 2 つの明細があり、どちらもヌルではありません

注文番号 2 には null の行が 1 つあります

クエリは完了しているため、#1 のみを返す必要があります。

4

2 に答える 2

0
Select *
From orders As O
Where Not Exists    (
                    Select 1
                    From order_lines As OL1
                    Where OL1.Fullfilled Is Null
                         And OL1.OrderId = O.OrderId
                    )

SQL フィドルのバージョン

In 関数を使用する代替バージョン:

Select *
From orders As O
Where O.OrderId Not In    (
                          Select OL1.OrderId
                          From order_lines As OL1
                          Where OL1.Fullfilled Is Null
                          )

SQL フィドルのバージョン

添加

集計関数を使用してこれを実現したいという要望がありました。以下は解決策ですが、Exists 関数と In 関数を使用するフォームは、次のクエリよりもはるかに適切に意図を表現しているため、これら 2 つの形式のいずれかをお勧めします。

Select O.OrderId
From Orders As O
    Left Join Order_Lines As OL
        On OL.OrderId = O.OrderId
            And OL.Fullfilled Is Null
Group By O.OrderId
Having Count(OL.Id) = 0

SQL フィドルのバージョン

おそらく最高のパフォーマンスを発揮する別のフォーム:

Select O.OrderId
From Orders As O
    Left Join Order_Lines As OL
        On OL.OrderId = O.OrderId
            And OL.Fullfilled Is Null
Where OL.Id Is Null

SQL フィドルのバージョン

于 2013-05-21T04:04:44.533 に答える
0

左結合を使用し、条件を追加して、必要な列に null 以外の行のみを選択してクエリを実行します。このような。

SELECT ORDERS.ID 
FROM ORDERS 
LEFT JOIN ORDER_LINES 
    ON (ORDERS.ID = ORDER_LINES.ORDER_ID) 
WHERE ORDER_LINES.ORDER_ID is not null
于 2013-05-21T04:05:28.067 に答える