我有两个表,并且只想在第二个表中选择某个状态为“完成”的表。最重要的因素是所有货件需要完成。
First Table(订单)包括一个唯一的订单ID和几个包含客户详细信息的单元格。例如
Order_id | Name
1001 | John
1002 | Paula
1003 | Ben
第二个表格(货件)包含客户订购的所有物品以及是否已交付的状态,例如
Order_id | Shipment_number | Status
1001 | 8004 | complete
1001 | 8003 | processing
1002 | 8005 | complete
1003 | 8008 | processing
1003 | 8007 | processing
1003 | 8009 | complete
我尝试使用以下代码但不幸的是,结果显示所有订单ID,其中至少有一个相关的货件是“完整的”。
SELECT
order_id,
name
FROM orders
INNER JOIN shipments ON orders.order_id = shipments.order_id
WHERE
shipments.status = 'complete';
我对SQL很陌生并且真的很挣扎。在此先感谢:)
答案 0 :(得分:1)
SELECT Orders.OrderID
FROM orders
WHERE NOT EXISTS (SELECT OrderID
FROM shipments
WHERE status != 'complete' AND
shipments.OrderID = Orders.OrderID)
答案 1 :(得分:1)
您可以使用嵌套查询执行此操作:
编写一个查询,按order_id计算shipment.order_id组的计数,这将为您提供每个订单的总发货量,选择order_id和计数。
编写一个查询,按order_id计算shipment.order_id组,其中shipment.status ='complete',这为您提供每个订单的已完成货件,选择order_id和计数。
将1和2的结果与订单ID上的订单一起加入(1.count = 2.count),选择名称和order_id。
答案 2 :(得分:1)
你可以试试这个
SELECT order_id FROM <orders>
WHERE order_id NOT IN (SELECT order_id FROM <shipments> WHERE status <> 'complete')
尽管如此,根据您的系统,我会考虑在订单表中添加一个字段(有效地对其进行去标准化,但优点/缺点取决于您需要此信息的频率)并使用当前订单状态进行更新。
如果您经常需要这些信息,我可能是值得的。
答案 3 :(得分:0)
SELECT ship.order_id, ord.name
FROM shipments as ship
left join orders as ord on
ord.order_id = ship.order_id
where ship.status = 'complete'
答案 4 :(得分:0)
通常,执行此操作的最佳方法是在订单本身处设置一个级别,以指示订单是否已完全发货。
但是,虽然可能无法很好地扩展,但这可行。为了使其更好地扩展,您必须在子查询中另外连接BACK到订单以限制您正在查看的订单。
select order_id, name from
orders JOIN
(select order_id, count(*) from shipments where status = 'complete' group by order_id
INTERSECT
select order_id, count(*) from shipments group by order_id)
on order_id