使用内部查询获得 SQL 个结果

Getting SQL results with 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 

它给我一个错误提示,嵌套查询 returns 多于一行。

我想使用那个嵌套查询的是这个,

在 table 订单 ID:819-DBD-EB8-0E7 中有 3 件商品。只有当所有订购的商品都在部门 ID 11 中时,我才想获得 order no。(FKDepartmentID=11)

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

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

需要更正内部查询。

谢谢。

学习使用明确的 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
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 子句检查条件是否为真。您正在使用此 select 子查询返回 table 并且没有任何意义。 你可能想做这样的事情: 您要检查对应于部门 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