2009-08-05 45 views
1

我有一個帶有子操作的訂單列表。我如何創建完成訂單清單?完成的訂單必須完成所有子操作。SQL使用多個操作選擇完成的訂單

表 「訂單」:

order_no | suboperation | finished 
1  | preparing | 01/01/2009 
1  | scrubbing | 01/05/2009 
1  | painting  | 01/10/2009 
2  | preparing | 02/05/09 
2  | painting  | NULL 
3  | preparing | 03/01/2009 
3  | scrubbing | 03/15/2009 
3  | painting  | 03/10/2009 
4  | bending  | NULL 
4  | crashing  | NULL 
4  | staining  | NULL 
4  | painting  | NULL 

所需的輸出(完成訂單):

order_no 
1 
3 

回答

3

你也可以使用count,group by and having。這避免了必須做更高效的表連接。

create table #Orders (
    order_no int, 
    suboperation varchar(30), 
    finished smalldatetime) 

insert into #Orders values (1 , 'preparing' , '01/01/2009') 
insert into #Orders values (1 , 'scrubbing' , '01/05/2009') 
insert into #Orders values (1 , 'painting' , '01/10/2009') 
insert into #Orders values (2 , 'preparing' , '02/05/09') 
insert into #Orders values (2 , 'painting' , NULL) 
insert into #Orders values (3 , 'preparing' , '03/01/2009') 
insert into #Orders values (3 , 'scrubbing' , '03/15/2009') 
insert into #Orders values (3 , 'painting' , '03/10/2009') 
insert into #Orders values (4 , 'bending' , NULL) 
insert into #Orders values (4 , 'crashing' , NULL) 
insert into #Orders values (4 , 'staining' , NULL) 
insert into #Orders values (4 , 'painting' , NULL) 

select 
    order_no, 
    count(1) As NoOfSubtasks --count(1) gives the number of rows in the group 
    count(finished) As NoFinished, --count will not count nulls 
from #Stuff 
group by 
    order_no 
having 
    count(finished) = count(1) --if finished = number of tasks then it's complete 

drop table #Orders 
+0

非常感謝。這一個是非常好的:-) – Plasmuska 2009-08-05 17:00:58

1

一個很好的醇」 WHERE NOT EXISTS條款應該在這裏工作:

SELECT DISTINCT o.order_no 
FROM orders o 
WHERE NOT EXISTS (SELECT p.order_no 
        FROM orders p 
        WHERE p.order_no = o.order_no 
        AND p.finished IS NULL) 
+0

這將重複訂單號碼。你可以通過使它不同於o.order_no – pjp 2009-08-05 16:44:42

+0

@ pjp來解決這個問題 - 感謝你的發現。 – 2009-08-05 16:57:20

-1
SELECT order_no, suboperation, finished 
FROM orders o1 
WHERE NOT EXISTS(
    SELECT 1 
     FROM orders o2 
     WHERE o1.order_no = o2.order_no 
     AND o2 IS NULL) 
+1

什麼是o2 IS NULL。我認爲這是一個錯誤。 – pjp 2009-08-05 16:47:00

+0

修復'AND o2.finished IS NULL' 此外這是爲每個子任務返回一行。 – pjp 2009-08-05 16:48:16

+0

IS NULL選擇所有未關閉的訂單,這就是爲什麼此構造框架由NOT EXISTS – Dewfy 2009-08-05 17:07:03

0

我試圖找到一種方法,使用MIN功能,並想出了這個:

選擇order_no

從接單

GROUP BY order_no

HAVING (MIN(ISNULL(finished,0))<> 0)

null可能很煩人...

不是表現,也許,但我更容易理解。

+0

這一個看起來不錯,但我不得不改變它的Acccess。 SELECT order_no FROM Orders GROUP BY order_no HAVING(MIN(ISNULL(finished))= 0); – Plasmuska 2009-08-11 12:37:53