簡體   English   中英

Oracle SQL如何用更少的代碼編寫此Join?

[英]Oracle SQL How can I write this Join with less code?

您好,Oracle專家,我對如何正確連接兩個表有疑問。

我的第一個表格描述了休假類別,新的最大假期休假累計額所需的最短服務時間以及最大累計數。

PTRLVAC_LCAT_CODE   PTRLVAC_YEAR    PTRLVAC_ROLL_MAX_HRS
C1                  0               80                  
C1                  2               88
C1                  5               128
P3                  0               120
P3                  2               128
P3                  5               168

下表詳細列出了員工編號,雇用日期和休假類別

PEBEMPL_PIDM    PEBEMPL_HIRE_DATE   PEBEMPL_LCAT_CODE  
1234            01/09/2017          P3
3214            02/01/2014          C1

我現在擁有的聯接依賴CTE,我不確定這是否是最簡單的解決方案。 **我已將此處的表格列為CTE

with ptrlvac as(
    select 'C1' ptrlvac_lcat_code
          ,0 ptrlvac_year
          ,80 ptrlvac_roll_max_hrs
    from dual union all
    select 'C1', 2, 88 from dual union all
    select 'C1', 5, 128 from dual union all
    select 'P3', 0, 120 from dual union all
    select 'P3', 5, 128 from dual union all
    select 'P3', 2, 168 from dual
    ) , pebempl as(
    select 1234 pebempl_pidm
          ,to_date('09-JAN-2017', 'DD-MON-YYYY') pebempl_hire_date
          ,'P3' pebempl_lcat_code
    from dual
    UNION ALL
    select 3214, to_date('01-FEB-2014','DD-MON-YYYY'), 'C1' from dual
) ,leave as(
    select a.ptrlvac_lcat_code
          ,a.ptrlvac_year
          ,a.ptrlvac_roll_max_hrs
          ,row_number()
              over(partition by a.ptrlvac_lcat_code
                   order by a.ptrlvac_year) rn
    from ptrlvac a
    )
,leave_rules as(
    select a.ptrlvac_lcat_code
          ,a.ptrlvac_year year_start
          ,nvl(b.ptrlvac_year, 100)-1 year_end
          ,a.ptrlvac_roll_max_hrs
    from leave a
         left join leave b
         on  a.ptrlvac_lcat_code = b.ptrlvac_lcat_code
         and a.rn = b.rn - 1
    )
select distinct pebempl_pidm
          ,pebempl_hire_date
          ,floor(months_between(to_date(:seldate, 'DD-MON-YYYY'), pebempl_hire_date) / 12)  as service_years
          ,pebempl_lcat_code as lcat
          ,b.ptrlvac_roll_max_hrs
    from pebempl a
         inner join leave_rules b
         on a.pebempl_lcat_code = b.ptrlvac_lcat_code
         and floor(months_between(to_date(:seldate, 'DD-MON-YYYY'), pebempl_hire_date) / 12) between b.year_start and b.year_end

任何節省一些按鍵的幫助將不勝感激。

提前致謝。

我不確定這是否滿足您的要求:

select
t2.PEBEMPL_PIDM,
t1.PTRLVAC_ROLL_MAX_HRS
from test1 t1, test2 t2
where
t1.PTRLVAC_LCAT_CODE = t2.PEBEMPL_LCAT_CODE and
t1.PTRLVAC_YEAR = 
(select max(t1s.PTRLVAC_YEAR) from test1 t1s
where t1s.PTRLVAC_LCAT_CODE = t2.PEBEMPL_LCAT_CODE
and (sysdate-PEBEMPL_HIRE_DATE)/365 >= t1s.PTRLVAC_YEAR);

以下是我根據您的測試數據得出的結果:

PEBEMPL_PIDM PTRLVAC_ROLL_MAX_HRS                                               
------------ --------------------                                               
        3214                   88                                               
        1234                  120                                               

鮑比

在午餐時有這種想法,進一步減少了@BobbyDurret的答案:

select
t2.PEBEMPL_PIDM,
max(t1.PTRLVAC_ROLL_MAX_HRS)
from ptrlvac t1, pebempl t2
where
t1.PTRLVAC_LCAT_CODE = t2.PEBEMPL_LCAT_CODE and
(sysdate-PEBEMPL_HIRE_DATE)/365 >= t1.PTRLVAC_YEAR
group by t2.PEBEMPL_PIDM

假設Max_Hrs在使用年限更長的時候總是會增加。

代替使用row_number和在單獨的CTE中進行過濾,請使用Lead:

with leave_rules as
(
    select a.ptrlvac_lcat_code
          ,a.ptrlvac_year as year_start
          ,a.ptrlvac_roll_max_hrs
          ,lead(ptrlvac_year,1,10000) over (partition by ptrlvac_lcat_code
                                 order by ptrlvac_year)
          as year_end
    from ptrlvac a
)
select distinct pebempl_pidm
          ,pebempl_hire_date
          ,floor(months_between(sysdate, pebempl_hire_date) / 12)  as service_years
          ,pebempl_lcat_code as lcat
          ,b.ptrlvac_roll_max_hrs
    from pebempl a
         inner join leave_rules b
         on a.pebempl_lcat_code = b.ptrlvac_lcat_code
         and floor(months_between(sysdate, pebempl_hire_date) / 12) between year_start and year_end

將您的2個CTE組合起來以將“ leave_rules”計算為1。我只將sysdate用作date變量,以便可以輕松進行測試-您可能希望像原來一樣使用綁定變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM