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 子句检查条件是否为真。您正在使用此选择子查询返回一个表,并且没有任何意义。你可能想做这样的事情:你想检查对应于 dept 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 回答