0

SQL クエリに問題があります。

select 
    o.orderID,c.city 
from 
    `order` o, `customer` c, `ordered_items` oi 
where 
    o.FKCustomerID = c.customerID 
    and o.orderStatus = 'IN PROGRESS' 
    and o.orderID = oi.FKOrderID 
    and (select FKDepartmentID 
         from ordered_items 
         where orderedItemsID in (select orderedItemsID 
                                  from ordered_items 
                                  where FKOrderID = o.orderID) 
           and FKDepartmentID = 11)
order by 
    c.city asc 

ネストされたクエリが複数の行を返すというエラーが表示されます。

そのネストされたクエリを使用したいのはこれです、

ここに画像の説明を入力

テーブルの注文 ID: 819-DBD-EB8-0E7 には 3 つのアイテムがあります。注文したすべてのアイテムが部門 ID 11 にある場合にのみ、その注文を取得したい(FKDepartmentID=11)

したがって、その注文には 3 つのアイテムがあり、すべてのアイテムは部門 11 にあります。したがって、その注文を取得する必要があります。その部門にアイテムが 2 つしかない場合は、取得しないでください。

SQLクエリを使用してそれを取得する方法は? 私のクエリでは、内部クエリを除く他の部分は問題ありません。

内部クエリを修正する必要があります。

ありがとう。

4

2 に答える 2

2

join明示的な構文を使用する方法を学びます。これでこの問題は解決しませんが、将来の問題が発生する前に解決されます。

クエリの解決策は、を使用することgroup byです。次に、 11以外の部門の数を数え、その数が 0 である注文のみを取得します。

select o.orderID, c.city 
from `order` o join
     `customer` c
     on o.FKCustomerID = c.customerID  join
     `ordered_items` oi 
     on o.orderID = oi.FKOrderID
where o.orderStatus = 'IN PROGRESS' 
group by o.order_id, c.city
having sum(FKDepartmentID <> 11) = 0
order by c.city asc ;

注: 構文は、MySQL を使用していることを示唆しています。より一般的なhaving条項は次のとおりです。

having sum(case when FKDepartmentID <> 11 then 1 else 0 end) = 0
于 2015-04-15T12:09:14.047 に答える
0
and 
(select FKDepartmentID from ordered_items where orderedItemsID in
(select orderedItemsID from ordered_items where FKOrderID=o.orderID)  
  and                              
FKDepartmentID=11)
order by c.city asc 

この内部クエリは、実際には意味をなさない where 条件にあります。これは、WHERE 句が条件が true かどうかをチェックするためです。この選択サブクエリを使用してテーブルを返していますが、意味がありません。あなたはおそらく次のようなことをしたいと思うでしょう: 部門 11 に対応する注文が存在するかどうかを確認したいとします。SQL で EXISTS 句を使用すると、次のように実行できます。

select o.orderID,c.city 
from `order` o,`customer` c,`ordered_items` oi 
where o.FKCustomerID=c.customerID 
and 
o.orderStatus='IN PROGRESS' 
and 
o.orderID=oi.FKOrderID 
and 
EXISTS (select orderedItemsID from ordered_items where FKOrderID=o.orderID and FKDepartmentID=11)
order by c.city asc 
于 2015-04-15T12:19:16.813 に答える