使用内部查询获取SQL结果

时间:2015-04-15 12:02:54

标签: sql inner-query

我遇到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 

它给我一个错误说,嵌套查询返回多行。

我想使用嵌套查询是什么,

enter image description here

在表格中,id:819-DBD-EB8-0E7有3个项目。我希望只有当所有订购的商品都在部门ID 11中时才能获得订单。(FKDepartmentID = 11)

因此该订单有3个项目,所有项目都在部门11中。因此应该检索该订单。如果该部门中只有2个项目,则不应检索该项目。

如何使用sql查询获取?在我的查询中,除了内部查询之外的其他部分都可以。

需要更正内部查询。

感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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