使用内部查询获得 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
我遇到了 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