查询插入临时表

时间:2013-11-20 21:18:16

标签: mysql sql

我的表缺席有以下字段

  

id,utilisateurs_id,date_debut,date_fin,type,`statut

我将根据示例解释我的问题:

        ----------------+------------------+------------------+---------------------
       |id              |  utilisateurs_id |date_debut        | date_fin           |
        ----------------+------------------+------------------+---------------------
       |     15         |          12      |2012-01-20        |2012-01-25          |
        ----------------+------------------+------------------+---------------------
       |     20         |          12      |2012-01-27        |2012-01-29          |
        ----------------+------------------+------------------+---------------------
       |     23         |          17      |2012-01-20        |2012-01-2           |
        ----------------+------------------+------------------+---------------------
       |     27         |          12      |2012-04-10        |2012-04-12          |
        ----------------+------------------+------------------+---------------------

我想找到一种填充临时表tempabsence的方法,该临时表tempabsence具有与缺省相同的字段,如果id有冗余,则计算enddate和startdate之间的差异,如果此差异小于3,则enddate获取值startdate else在tempabsences中插入此列

    ----------------+------------------+------------------+---------------------
   |id              |  utilisateurs_id |date_debut        | date_fin           |
    ----------------+------------------+------------------+---------------------
   |     15         |          12      |2012-01-20        |2012-01-29          |
    ----------------+------------------+------------------+---------------------
   |     23         |          17      |2012-01-20        |2012-01-2           |
    ----------------+------------------+------------------+---------------------
   |     27         |          12      |2012-04-10        |2012-04-12          |
    ----------------+------------------+------------------+---------------------

我尝试实现它,但脚本没有返回我想要的结果。

CREATE TEMPORARY TABLE tempabsences  LIKE absences;


    INSERT INTO tempabsences(id ,utilisateurs_id,date_debut,tempabsences.date_fin,type,statut)
    SELECT absences.utilisateurs_id ,absences.utilisateurs_id,absences.date_debut,absences.date_fin,absences.type,absences.statut
    FROM absences 
    ORDER BY absences.date_debut ASC,absences.date_fin ASC, absences.utilisateurs_id ASC
    ON DUPLICATE KEY UPDATE tempabsences.date_fin=IF(abs(DATEDIFF(tempabsences.date_fin,absences.date_debut)<3) and (tempabsences.utilisateurs_id=absences.utilisateurs_id),tempabsences.date_fin,absences.date_fin),
                tempabsences.utilisateurs_id= IF(abs(DATEDIFF(tempabsences.date_fin,absences.date_debut)<3)and (tempabsences.utilisateurs_id=absences.utilisateurs_id),tempabsences.utilisateurs_id,absences.utilisateurs_id),
                tempabsences.id=IF(abs(DATEDIFF(tempabsences.date_fin,absences.date_debut)<3)and (tempabsences.utilisateurs_id=absences.utilisateurs_id),tempabsences.id,(select tempabsences.id from absences ) )
    ;

任何帮助将不胜感激。 问候。

1 个答案:

答案 0 :(得分:1)

我认为它必须像

BEGIN
  FOR rec_ IN (
                SELECT absences.utilisateurs_id ,absences.utilisateurs_id,absences.date_debut,absences.date_fin,absences.type,absences.statut
                FROM absences 
                ORDER BY absences.date_debut ASC,absences.date_fin ASC, absences.utilisateurs_id ASC
                )

     BEGIN           
        INSERT INTO tempabsences(rec_.id ,rec_.utilisateurs_id,rec_.date_debut,rec_.tempabsences.rec_.date_fin,rec_.type,rec_.statut);
     EXCEPTION
       WHEN dup_val_on_index THEN

        for rec2_ in (SELECT * FROM tempabsences WHERE id = rec_.utilisateurs_id) loop

          if rec2_.date_fin  - rec2_.date_debut < 3 then

              update absences
                 set date_fin = date_debut
                where utilisateurs_id = rec_.utilisateurs_id;

          else
             ----- else statement here
          end if;
        end loop;

     END;

END;