如何获取一个表中的所有值,但只有另一个表中的一些值

时间:2017-05-01 22:13:27

标签: sql oracle

我们有两张表格,里面有关于病假和休假应计的信息。一个是总体工资表,另一个是一个临时表,主管用来验证员工是否已进入每个月的病假/休假时间,或确认他们正在那个月0小时。

薪资表为PS_LEAVE_ACCRUAL,并且具有此结构(以及其他不相关的列):

EMPLID | EMPL_RCD | COMPANY | PLAN_TYPE | ACCRUAL_PROC_DT | HRS_TAKEN_UNPROC
------ | -------- | ------- | --------- | --------------- | ----------------
123456 | 0        | ABC     | 50        | 28-FEB-17       | 3
123456 | 0        | ABC     | 51        | 28-FEB-17       | 0
987654 | 0        | ABC     | 50        | 28-FEB-17       | 0
987654 | 0        | ABC     | 51        | 28-FEB-17       | 3

临时表为Y_SIC_VAC_HRS,它具有上述结构,但有一个额外的列Y_NO_HRS_TAKEN,其中包含Y / N值。这用于验证如果员工在某个月内花了0小时,他们已经确认了,而不是仅仅将其保留为0

我们需要构建一个SQL语句来抓取PS_LEAVE_ACCRUAL表中0 HRS_TAKEN_UNPROC的所有值,并将其与Y_SIC_VAC_HRS表连接到删除HRS_TAKEN_UNPROC不是0的所有已加入行,或者 0时,Y_NO_HRS_TAKEN标记设置为Y这意味着员工已经确认他们正在那个月0小时。

基本上,我们只关心员工为病假/休假时间输入余额的月份(如果Y_NO_HRS_TAKEN标志为Y,那就是相当于他们进入平衡)。我们也只关心在作为绑定:1传递的任意日期之后的行。

以下是我们尝试过的SQL:

SELECT la.EMPLID  
 , la.EMPL_RCD  
 , la.COMPANY  
 , la.PLAN_TYPE  
 , la.ACCRUAL_PROC_DT  
 , la.HRS_TAKEN_UNPROC  
 , 'N'  
  FROM PS_LEAVE_ACCRUAL la LEFT OUTER JOIN PS_Y_SIC_VAC_HRS sv ON la.EMPLID = sv.EMPLID  
   AND la.EMPL_RCD = sv.EMPL_RCD  
   AND la.COMPANY = sv.COMPANY  
   AND la.PLAN_TYPE = sv.PLAN_TYPE  
   AND la.ACCRUAL_PROC_DT = sv.ACCRUAL_PROC_DT  
 WHERE (la.HRS_TAKEN_UNPROC = 0  
   AND la.PLAN_TYPE IN ('50', '51')  
   AND la.ACCRUAL_PROC_DT > :1)  
    OR ( sv.HRS_TAKEN_UNPROC = 0  
   AND sv.Y_NO_HRS_TAKEN = 'N')

请注意,计划类型50指的是病假时间,51指的是假期时间。

PS_LEAVE_ACCRUAL中每个月有一个条目,但Y_SIC_VAC_HRS每个月可能没有条目。

2 个答案:

答案 0 :(得分:1)

这样的东西?

let target = 3.9;
sortedArray.sort((a, b) => Math.abs(a.b - target) > Math.abs(b.b - target))[0]

答案 1 :(得分:0)

@ mathguy的回答几乎对我有用,但我真正需要的是:

select emplid, empl_rcd, company, plan_type, accrual_proc_dt, hrs_taken_unproc
from   ps_leave_accrual
where  accrual_proc_dt > :1
  and  plan_type in ('50', '51')
  and  hrs_taken_unproc = 0
  and  (emplid, plan_type, accrual_proc_dt) 
         not in ( 
                  select emplid, plan_type, accrual_proc_dt
                  from   ps_y_sic_vac_hrs
                  where  accrual_proc_dt > :1
                    and  plan_type in ('50', '51')
                    and (y_no_hrs_taken = 'Y' 
                        or hrs_taken_unproc <> 0
                    )
                )
;

我需要从登台表中过滤掉两种类型的行:

  1. hrs_taken_unproc位于0 的位置标记了表示已审核过的国旗。
  2. 他们所拥有的行&#34;纠正&#34; (0在原始工资表中的小时数,但在临时表中为<> 0