如何组合两个不同的查询以获得一个输出

问题描述 投票:0回答:1

我创建了以下两个查询,以查看表per_assignments和per_supervisor中针对locat_id,org_id,mng_id列的更改。

with asg_loc_dep as (
  select person_id,
         prev_start_dt,
         start_dt, 
         loc_old,
         loc_new,
         org_new,
         org_old
  from   (
    select person_id,
           locat_id loc_new,
           org_id org_new,
           start_dt, 
           lag(locat_id) over (partition by person_id order by start_dt) loc_old,
           lag(org_id) over (partition by person_id order by start_dt) org_old, 
           lag(start_dt) over (partition by person_id order by start_dt) prev_start_dt, 
           case start_dt when 1 + lag(end_dt) over (partition by person_id order by start_dt) 
           then 1 end flag
    from   per_assignments
  )
  where  flag = 1
  and (loc_new <> loc_old or org_new <> org_old)
)
with asg_asg as (
  select person_id,
         prev_start_dt,
         start_dt, 
         new_mgr,
         mngid_old
  from   (
    select person_id,
           mng_id new_mgr,
           start_dt, 
           lag(mng_id) over (partition by assignment_id order by start_dt) mngid_old,
           lag(start_dt) over (partition by assignment_id order by start_dt) prev_start_dt, 
           case start_dt when 1 + lag(end_dt) over (partition by assignment_id order by start_dt) 
           then 1 end flag
    from   per_supervisor
  )
  where flag = 1
  and (mngid_old<>new_mgr)
)

我分别得到正确的结果,有没有一种方法可以将这两个查询合并为一个以获得以下输出结构:

person_id  prev_start_dt start_dt loc_old  loc_new org_new org_old   mngid_old    new_mgr

这两个查询之间的通用链接是person_id。如果我使用工会,我将为剩下的列传递什么,如果同一日期-prev_start_dt和start_dt的loc_new和new_mgr发生变化,则它应该排在第一行。与工会将它分为两​​行。

仅在第一个查询中摆弄样本

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=a3b74f9c4f8371ad23bbf53dcbe41f67

WITH loc_dep AS 
( 
       SELECT person_id, 
              prev_start_dt, 
              start_dt, 
              --assignment_id, 
              loc_old, 
              loc_new, 
              org_old, 
              org_new 
       FROM   ( 
                       SELECT   person_id, 
                                assignment_id, 
                                location_id                                                                           loc_new,
                                organization_id                                                                       org_new,
                                effective_start_date                                                                  start_dt,
                                Lag(location_id) OVER (partition BY person_id ORDER BY effective_start_date)          loc_old,
                                Lag(organization_id) OVER (partition BY person_id ORDER BY effective_start_date)      org_old,
                                Lag(effective_start_date) OVER (partition BY person_id ORDER BY effective_start_date) prev_start_dt,
                                CASE effective_start_date 
                                         WHEN 1 + Lag(effective_end_date) OVER (partition BY person_id ORDER BY effective_start_date) THEN 1
                                END flag 
                       FROM     per_all_assignments_m paam 
                       WHERE    paam.person_id = '300000010518043' 
                       AND      paam.system_person_type = 'EMP' 
                       AND      paam.assignment_status_type = 'ACTIVE' 
                       AND      paam.assignment_type = 'E' ) 
       WHERE  flag = 1 
       AND    ( 
                     loc_new <> loc_old 
              OR     org_new <> org_old)) , 
              with mgr_compare AS 
( 
                SELECT DISTINCT person_id, 
                                prev_start_dt, 
                                start_dt, 
                                mngr_new, 
                                mngr_old 
                FROM            ( 
                                         SELECT   person_id, 
                                                  manager_id                                                                                 mngr_new,
                                                  effective_start_date                                                                       start_dt,
                                                  effective_end_date                                                                         end_date,
                                                  lag(manager_id) OVER ( partition BY assignment_id ORDER BY effective_start_date)           mngr_old,
                                                  lag(effective_start_date) OVER ( partition BY assignment_id ORDER BY effective_start_date) prev_start_dt,
                                                  CASE effective_start_date 
                                                           WHEN 1 + lag(effective_end_date) OVER (partition BY assignment_id ORDER BY effective_start_date) THEN 1
                                                  END flag 
                                         FROM     per_assignment_supervisors_f pasf 
                                         WHERE    pasf.person_id = '300000010518043') 
                WHERE           flag = 1 
                AND             ( 
                                                mngr_new <> mngr_old )) 
SELECT mgr_compare.person_id 
FROM   mgr_compare, 
       loc_dep 
WHERE  loc_dep.person_id = mgr_compare.person_id
sql oracle
1个回答
0
投票

您可以将两个CTE放在同一个查询中,然后将结果join放入person_id

with 
    asg_loc_dep as (
        select 
            person_id, 
            prev_start_dt, 
            start_dt, 
            loc_old, 
            loc_new, 
            org_new,
            org_old
        from ( ... )
        where ...
    ),
    asg_asg as (
        select 
            person_id, 
            prev_start_dt, 
            start_dt, 
            new_mgr,
            mngid_old
        from (...)
        where ...
    )
select 
    l.person_id,
    l.prev_start_dt,
    l.start_dt,
    l.loc_old,  
    l.loc_new, 
    l.org_new, 
    l.org_old,
    a.mngid_old,
    a.new_mgr
from asg_loc_dep l
inner join asg_asg a on a.person_id = l.person_id
© www.soinside.com 2019 - 2024. All rights reserved.