2016-05-24 26 views
0

這是presentation表:插入使用子查詢中加入基於日兩個日期之間的日期[的Oracle 11g]

ID  PRESENTATIONDAY   PRESENTATIONSTART  PRESENTATIONEND  PRESENTATIONSTARTDATE    PRESENTATIONENDDATE 
622   Monday     12:00:00    02:00:00    01-05-2016       04-06-2016 
623  Tuesday     12:00:00    02:00:00    01-05-2016       04-06-2016 
624  Wednesday     08:00:00    10:00:00    01-05-2016       04-06-2016 
625  Thursday     10:00:00    12:00:00    01-05-2016       04-06-2016 

我想在schedule表中插入availabledate。這是我當前的查詢:

insert into SCHEDULE (studentID,studentName,projectTitle,supervisorID,  
         supervisorName,examinerID,examinerName,exavailableID, 
        availableday,availablestart,availableend, 
        availabledate) //PROBLEM STARTS HERE                                                                                                                                                                        
values (?,?,?,?,?,?,?,?,?,?,?,?)); 

availabledate是基於exavailableID 檢索。例如,如果exavailableID = 2,則availableday =星期一,availablestart = 12pm,availableend = 2pm。

日期只會在PRESENTATIONSTARTDATEPRESENTATIONENDDATE之間從presentation表中選擇。

presentation表,它將匹配PRESENTATIONDAYPRESENTATIONDATESTARTPRESENTATIONDATEENDavailabledayavailablestartavailableend得到所有可能的日期列表。

這是查詢以獲得基於特定日子的所有可能的日期列表:

select 
    A.PRESENTATIONID, 
    A.PRESENTATIONDAY, 
    A.PRESENTATIONDATESTART+delta LIST_DATE 
from 
    PRESENTATION A, 
    (
    select level-1 as delta 
    from dual 
    connect by level-1 <= (
     select max(PRESENTATIONDATEEND- PRESENTATIONDATESTART) from PRESENTATION 
    ) 
) 
where A.PRESENTATIONDATESTART+delta <= A.PRESENTATIONDATEEND 
and 
    a.presentationday = trim(to_char(A.PRESENTATIONDATESTART+delta, 'Day')) 
order by 1,2,3; 

這個查詢的結果是:

622 Monday 02-05-2016 12:00:00 
... 
622 Monday 30-05-2016 12:00:00 
623 Tuesday 03-05-2016 12:00:00 
... 
623 Tuesday 31-05-2016 12:00:00 
624 Wednesday 04-05-2016 12:00:00 
... 
624 Wednesday 01-06-2016 12:00:00 
625 Thursday 05-05-2016 12:00:00 
... 
625 Thursday 02-06-2016 12:00:00 

它會自動從SELECT查詢指定日期是插入schedule表中。但是,每個日期只能使用4次。一旦達到4次,就會進入下一個日期。例如,如果週一,'02 -05-2016' 到'09 -05-2016'

我怎麼能企業這兩個查詢(INSERTSELECT)有這樣的結果:

StudentName projectTitle SupervisorID ExaminerID availableday availablestart  availableend  availabledate 
     abc   Hello  1024  1001   MONDAY   12.00pm    2.00pm   02-05-2016 
     def   Hi  1024  1001   MONDAY   12.00pm    2.00pm   02-05-2016 
     ghi   Hey  1002  1004   MONDAY   12.00pm    2.00pm   02-05-2016 
     xxx   hhh  1020  1011   MONDAY   12.00pm    2.00pm   02-05-2016 
     jkl   hhh  1027  1010   MONDAY   12.00pm    2.00pm   09-05-2016 
     try   ttt  1001  1011   MONDAY   12.00pm    2.00pm   09-05-2016 
     654   bbb  1007  1012   MONDAY   12.00pm    2.00pm   09-05-2016 
     gyg   888  1027  1051   MONDAY   12.00pm    2.00pm   09-05-2016 
     yyi   333  1004  1022   TUESDAY   12.00pm    2.00pm   03-05-2016 
     fff   111  1027  1041   TUESDAY   .. 
     ggg   222  1032  1007   TUESDAY   .. ..      ..    .. 
     hhh   444  1007  1001   TUESDAY   12.00pm    2.00pm   03-05-2016 


     and so on :) 

總之,我想用presentation表的日期列表根據當天,開始時間和結束時間來插入查詢,每個日期只會用到4次。謝謝!

回答

0

我不確定這種語法是否適用於oracle(並沒有很好的方法來檢查),但是像這樣改變插入的select部分可能會也可能不會。

select 
    A.PRESENTATIONID, 
    A.PRESENTATIONDAY, 
    A.PRESENTATIONDATESTART+delta LIST_DATE 
from 
    PRESENTATION A, 
    (
    select level-1 as delta 
    from dual 
    connect by level-1 <= (
     select max(PRESENTATIONDATEEND - PRESENTATIONDATESTART) from PRESENTATION 
    ) 
), 
    --MIGHT NEED ADDITIONAL LOGIC FOR THE EXAVAILABLEID COMPARISON 
    (SELECT count(S.*) as counter FROM SCHEDULE S WHERE S.EXAVAILABLEID=A.ID) C 
where A.PRESENTATIONDATESTART+delta <= A.PRESENTATIONDATEEND 
and 
    a.presentationday = trim(to_char(A.PRESENTATIONDATESTART+delta, 'Day')) 
and 
    C.counter<4 
order by 1,2,3; 

編輯:改變了運營商。有> =之前。放置在哪裏檢查在正確的地方。刪除別名。

EDIT2:將語法更改爲where語句是from子句的一部分。

+0

感謝您的時間@Dahamsta :)這個查詢如何幫助我只使用每個日期4次? – user6308605

+0

對不起,我完全誤解了這個問題。我現在明白了。你可能要做的是在更新之前創建一個觸發器,如果​​在日程表中已經有四行帶有演示ID的話,那麼檢查並拋出一個錯誤。 – Dahamsta

+0

我不明白觸發器級聯部分...至少有任何一般的例子? – user6308605