我遇到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查询获取?在我的查询中,除了内部查询之外的其他部分都可以。
需要更正内部查询。
感谢。
答案 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