【问题标题】:Insert using subquery by adding dates between two dates based on days [oracle 11g]通过在基于天的两个日期之间添加日期来使用子查询插入 [oracle 11g]
【发布时间】:2016-09-21 08:51:51
【问题描述】:

这是presentation 表:

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。

日期只能在presentation 表中的PRESENTATIONSTARTDATEPRESENTATIONENDDATE 之间选择。

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 次。谢谢!

【问题讨论】:

    标签: oracle date oracle11g insert subquery


    【解决方案1】:

    我不确定这种语法是否适用于 oracle(并且没有好的方法来检查),但是像这样更改插入的选择部分可能会也可能不会。

    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;
    

    编辑:更改了操作员。之前有>=。在正确的地方放置了 WHERE 检查。已删除别名。

    EDIT2:将语法更改为 counter select 语句是 from 子句的一部分。

    【讨论】:

    • 感谢您抽出宝贵时间@Dahamsta :) 这个查询如何帮助我每次只使用日期 4 次?
    • 对不起,我完全误解了这个问题。我现在明白了。您可能会做的是在更新之前创建一个触发器,如果​​日程表中已经有四行带有演示 ID 的行进行检查并抛出错误。
    • 我不明白触发级联部分......至少有什么一般的例子吗?
    • 这很复杂!!实际上,exavailableID 不是来自presentationID...exavailableID 是从另一个表中检索的。所以我只是将它们与日期、开始时间和结束时间相匹配,因为 ID 不相似。但是,我尝试了您的查询并进行了一些调整,但出现错误:ORA-04089: cannot create triggers on objects owned by SYS
    • 如果您使用特定模式,则应在 INSERT ON "your schema".schedule 之前将触发器定义为 CREATE OR REPLACE TRIGGER insert_schedule。此外,这只会停止插入具有相同演示 ID 的第五个元素,并引发错误。
    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2015-08-15
    • 1970-01-01
    • 2010-12-11
    • 2018-07-25
    相关资源
    最近更新 更多