如何根据两个表选择数据

时间:2011-10-28 18:35:56

标签: sql

我有两个表,并且只想在第二个表中选择某个状态为“完成”的表。最重要的因素是所有货件需要完成。

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很陌生并且真的很挣扎。在此先感谢:)

5 个答案:

答案 0 :(得分:1)

SELECT Orders.OrderID 
FROM orders 
WHERE NOT EXISTS (SELECT OrderID 
                  FROM shipments 
                  WHERE status != 'complete' AND 
                        shipments.OrderID = Orders.OrderID)

答案 1 :(得分:1)

您可以使用嵌套查询执行此操作:

  1. 编写一个查询,按order_id计算shipment.order_id组的计数,这将为您提供每个订单的总发货量,选择order_id和计数。

  2. 编写一个查询,按order_id计算shipment.order_id组,其中shipment.status ='complete',这为您提供每个订单的已完成货件,选择order_id和计数。

  3. 将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