2012-09-13 125 views
0

我有兩個表PROCESS和STEP以及一些數據,如下所示。 (他們有1-N的關係。)我需要什麼樣的JOIN語句?

PROCESS -> 

ID START_TIME STARTED_BY STATUS 
1 31/08/2012 User1  FINISHED 
2 31/08/2012 User2  FINISHED 
3 05/09/2012 User3  ACTIVE 

STEP -> 

ID PROCESS_ID START_TIME END_TIME STATUS 
1 1   31/08/2012 02/09/2012 FINISHED 
2 1   02/09/2012 03/09/2012 FINISHED  
3 1   03/09/2012 10/09/2012 FINISHED 
4 2   31/08/2012 04/09/2012 FINISHED 
5 2   04/09/2012 06/09/2012 FINISHED 
6 2   06/09/2012 09/09/2012 FINISHED 
7 3   05/09/2012 06/09/2012 FINISHED  
8 3   06/09/2012 NULL  ACTIVE 

我需要的是一個加盟,這會給我開始和像下面成品過程的結束時間:

PROCESS_ID START_TIME END_TIME 
1   31/08/2012 10/09/2012 
2   31/08/2012 09/09/2012 

什麼樣的JOIN語句做我需要寫信來完成這個任務?

回答

2

爲了避免PROCESS_ID 3拉,你需要聚合和過濾第一

HAVING子句將確保你忽略STEP表PROCESS_ID 3的所有行。簡單的WHERE END_TIME IS NOT NULLWHERE .. 'FINISHED'不會這樣做。也不會聚集在連接後

SELECT 
    P.PROCESS_ID, 
    S.StartTime, S.EndTime 
FROM 
    PROCESS P 
    JOIN 
    (
    SELECT 
     PROCESS_ID, 
     MIN(START_TIME) AS StartTime, 
     MAX(END_TIME) AS EndTime 
    FROM 
     STEP 
    GROUP BY 
     PROCESS_ID 
    HAVING 
     COUNT(*) = COUNT(END_TIME) -- only where we have no END_TIME nulls 
    ) S ON P.PROCESS_ID = S.PROCESS_ID 

還有其他的選擇了NOT EXISTS忽略ACTIVE行,例如,但我只用END_TIME這裏NULL值忽略STEP行

1

看起來你需要一個INNER JOIN並使用MINMAX功能。

SELECT PROCESS.PROCESS_ID, MIN(START_TIME), MAX(END_TIME) 
FROM PROCESS 
INNER JOIN STEP ON STEP.PROCESS_ID = PROCESS.PROCESS_ID 
GROUP BY PROCESS.PROCESS_ID 
+0

你爲什麼要加入步驟表? – Johan

+0

@Johanh - 因爲STEP有一個PROCESS_ID字段,它在兩個表之間是通用的,並且包含OP要求的END_TIME字段。 –