2010-05-04 365 views
1

我有一個包含循環代碼列表的表.CYCLE_DEFINITION。 每個cycle_code在另一個表中有12個月的條目(PM1_CYCLE_STATE)。 每個月都有一個cycle_start_date和一個cycle_close_date。 我會檢查一個特定的日期(可以說sysdate)並檢查每個週期的當前月份是什麼。此外,我還將獲得該特定週期未來3個月的列表。sql查詢 - 需要一些建議

我寫的查詢如下:

SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,LTRIM(pcs.cycle_month,'0')+0 CM, pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 
UNION 
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+1,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+1) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 
UNION 
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+2,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+2) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 
UNION 
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+3,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+3) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 

該查詢運行完全正常。 這將導致當前月份和未來3個月的所有cycle_codes包含4行。

現在的要求是,如果任何一個月missing.how我可以顯示它嗎? 爲例如:上述查詢的輸出是

cycd cm 
102 1 
102 10 
102 11 
102 12 
103 1 
103 10 
103 11 
103 12 
104 1 
104 10 
104 11 
104 12 

現在讓我們說與cycd = 104和釐米= 11行是不存在於表格中,則上述查詢不會得到該行104 11。 我只想顯示那些行。 我怎麼能這樣做?

+0

您需要一個左外部連接http://dev.mysql.com/doc/refman/5.0/en/join.html – Konerak 2010-05-04 06:33:37

回答

0

我通過很多的思考另一種更好的方法。 如果我有像這樣的列表:

102 1 
102 10 
102 11 
102 12 
103 1 
103 10 
103 11 
103 12 

然後我還可以得到現有條目列表中的表像下面(可以說103 11是不存在的表)。現在我查詢的輸出將下面

102 1 
102 10 
102 11 
102 12 
103 1 
103 10 
103 12 

,因爲我具備上述兩個名單,我可以簡單地做兩個查詢負,並得到所需要的輸出爲每個問題我asked.And我做我得到了在same.and預期的輸出。如果你想查看查詢請發表一些評論!

0

創建一個包含月1〜12的表,交叉聯接個月pm1_cycle_state,並留下參加與SELECT語句(可能是因爲一個視圖):

SELECT pm1_cycle_state.cycle_code, months.month 
FROM pm1_cycle_state 
CROSS JOIN months 
LEFT OUTER JOIN V_Cycle_Months 
    ON V_Cycle_Months.cycd = pm1_cycle_state.cycle_code 
    AND V_Cycle_Months.cm = months.month 
WHERE V_Cycle_Months.cycd IS NULL 
+0

此查詢doesnot不給我所需的輸出。 如果104缺少'104 11'條目,我只希望'104 11'.but此查詢給出了包括11在內的所有月份,例如:它給我和循環月的輸出2 3 4 5 6 7 8 9 11。but我只需要11 – Vijay 2010-05-04 07:19:52

+0

@bb,那麼要麼只在月表中使用有趣的月份,要麼代替pm1_cycle_state CROSS JOIN使用月份(這裏是您的聯合查詢) – Unreason 2010-05-04 08:03:18