0

私は2つのテーブルを持っています:

注文:

Id   |  Status
-----+--------
 1   |      OK
 2   | WAITING
 3   | WAITING
 4   |      OK
 5   |      OK
 6   |      OK

そして Order_details:

Id   |  Order_Id  |  Status
-----+------------+--------
 1   |         1  |      S1
 2   |         1  |      S1
 3   |         2  |      S1
 4   |         4  |      S2
 5   |         4  |      S2
 6   |         4  |      S3
 7   |         5  |      S1
 8   |         5  |      S1

私がする必要があるのは、複数の Order_detail を持つすべての注文を選択することであり、注文ステータスは「OK」でなければならず、すべての order_detailには (S1,S2) のステータスが必要です。

私はこのようなことをしました:

SELECT O.Id FROM Orders O 
            JOIN Order_details OD 
                ON O.Id=OD.Order_Id
WHERE O.Status='OK' AND OD.Status IN ('S1','S2')
GROUP BY O.Id
HAVING count(DISTINCT OD.Id)>1

ただし、これは、複数の Order_details を満たす基準を持つすべての注文を返します。

この部分は問題ないと確信しています:

SELECT O.Id FROM Orders O 
            JOIN Order_details OD 
                ON O.Id=OD.Order_Id
WHERE O.Status='OK'
GROUP BY O.Id
HAVING count(DISTINCT OD.Id)>1

しかし、上記の注文のすべての Order_detail のステータスが IN (S1、S2) であるかどうかを確認する必要があります。

したがって、注文に 2 つの詳細があり、そのうちの 1 つが status=S1 で 2 番目の S3 の場合、この注文はスキップする必要があります。

4

2 に答える 2

2
SELECT O.Id 
FROM Orders O 
JOIN Order_details OD ON O.Id=OD.Order_Id
WHERE O.Status='OK'
GROUP BY O.Id
HAVING count(DISTINCT OD.Id)>1
AND SUM(CASE WHEN OD.Status NOT IN ('S1','S2') 
             THEN 1 
             ELSE 0 
        END) = 0
于 2012-12-27T09:43:58.140 に答える