mysql和oracle对于内连接和左右连接的使用(一)

1.左右连接的问题

    这种 事情 我不确定 什么时候会用到(可能复杂的 储存过程会用到)

       可能 一次 一张表和 3张以上的 表连接时,会用到

       1-1   from  a left join b on ...... 

                       就是说  以a 表为主 ,b表会把 空的 显示为 null

      1-2 还可以在 连接中一次可以 连多次,以便于 把列显示多次

        select zid,t1.tname as t1name,res,kid,t2.tname as t2name,mtime
                     from m left join t as t1 on m.zid = t1.tid  
                                   left join tas t2 on m.kid = t2.tid 
                     where mtime between '2006-06-01' and '2006-07-01';
                     总结:可以对同一张表连接多次,以分别取多次数据
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
2.对于 oracle 的一些 内置函数,很有用但是 功能有点 绕

  

case  when(

   

         SELECT sum(

           days*CASE WHEN PersonalLeaveType=0 

               THEN 100 ELSE 20 end 成立 则 100, 否则是 20

                           )  
                     FROM  

                  tb_personalleave WHERE emptId=emp.Id 

                    AND  to_char(PersonalLeaveDtm,''yyyy-MM'')=:dtm


                 ) 

                                      嵌套了 两层

               is NULL THEN 0  

else  ( )  end dddd--别名

................................

select     id , 

             case when  ()  is null then 0 else () end   name,

             addr

 from   emp 

.........................................................


 2-2看看 sql servier的   

create  procedure proc_getPayDetail
 (
 @dtm varchar(20)
 )
 as
 begin
select
@dtm,
emp.id, 

case

when(

                             值为空 则 返回0   否则 返回  本身

           select sum(days*150 ) from tb_Absence 

    where emptId=emp.id  and CONVERT(varchar(100),

    tb_Absence.absenceDtm, 102)=@dtm) 


             is null  

             then 0

   else(

          select sum(days*150 ) from tb_Absence 

         where emptId=emp.id  

         and CONVERT(varchar(100),tb_Absence.absenceDtm, 102)=@dtm)

end  absencepay

 

from tb_emp emp
end


public void updateEmp(EmployeeVo emp) throws Exception{
Connection conn = this.openConnection();
CallableStatement  cst = conn.prepareCall("{call sp_updateemp(?,?)}");
cst.setInt(1, emp.getEmpId());
cst.setString(2, emp.getEmpName());
//执行
cst.execute();
//如果返回表结构
// ResultSet rs = cst.getResultSet();....
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

2-3  mysql的写法

create PROCEDURE proc_getPayDetail(IN dtm VARCHAR(20))
  BEGIN
  SELECT  emp.empId,emp.ename,emp.basepay,

CASE
       WHEN (SELECT sum(hours * 20) FROM tb_overtime  
       WHERE emptId=emp.Id          
   AND DATE_FORMAT(overtimeDtm,'%Y-%m')=dtm) 
   is NULL THEN 0
   ELSE (SELECT hours*20 
   FROM tb_overtime  
   WHERE emptId=emp.Id AND
   DATE_FORMAT(overtimeDtm,'%Y-%m')=dtm)
   END overtimepay,

 CASE
   WHEN
(SELECT sum(

        days*(CASE WHEN PersonalLeaveType=0 

               THEN 100 ELSE 20 END)  成立 则 100, 否则是 20

)  
           FROM  

       tb_personalleave WHERE emptId=emp.Id 

                    AND DATE_FORMAT(PersonalLeaveDtm,'%Y-%m')=dtm) 

                                      嵌套了 两层

              is NULL THEN 0  


   ELSE (SELECT sum(days*(CASE WHEN PersonalLeaveType=0 THEN 100 ELSE 20 END))  
           FROM tb_personalleave WHERE emptId=emp.Id AND DATE_FORMAT(PersonalLeaveDtm,'%Y-%m')=dtm)
   END personalleavepay,   

   CALL proc_getPayDetail('2016-05');








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值