2011-10-28 28 views
4

我有兩個表,只想選擇第二個表中某個狀態爲「完成」的表。最重要的因素是全部出貨需要完成。如何根據兩個表選擇數據

第一個表格(訂單)包括一個唯一的訂單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新手,真的很苦惱。感謝提前:)

回答

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採取shipments.order_id組的數量,這給你的總出貨量對於每個訂單,請選擇order_id和計數。

  2. 編寫一個查詢來計算shipments.order_id group by order_id其中shipments.status ='complete',這會爲您提供每個訂單的完成裝運,選擇order_id和計數。

  3. 加入1和2的結果,在訂單id的位置(1.count = 2.count),選擇名稱和order_id。

1

你可以試試這個

SELECT order_id FROM <orders> 
WHERE order_id NOT IN (SELECT order_id FROM <shipments> WHERE status <> 'complete') 

即使如此,根據你的系統上,我會考慮以表(添加字段有效去正常化,但好處/缺點取決於你多久需要此信息)並使用當前訂單狀態進行更新。

如果您經常需要這些信息,我可能會值得。

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' 
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