【问题标题】:Oracle Join 2 views with 5 conditionsOracle Join 2 个视图,有 5 个条件
【发布时间】:2016-12-19 04:12:10
【问题描述】:

我必须加入 2 个视图 view_a 和 view_b。
view_a 有列 id,address1,address2,city,state,cntry view_b id,frst_name,last_name,type,date,job_title

想要的结果
id,Name,address1,address2,city,state,cntry,job_title

我的查询条件是:
1. 在 id 列上加入两个视图。
2. 按日期排序
3. 连接名字和姓氏
4. type等于“officer”
5. 如果有不止一名军官,则只产生一名军官,即根据日期的顶行。
6. 如果没有官员,则结果中 name 和 job_title 列的值为空。

我使用过的查询:

   select 
       * 
   from  
      view_a A 
   join 
   (
          select 
              (first_name || ' ' || last_name) as name,
              job_title,
              id 
          from 
              view_b 
                   where 
              type = 'officer' 
                    and 
               id is not null 
            order by date desc fetch first 1 row only
   ) B
   on A.id=B.id  

但是这个查询只产生一个结果。我正在使用 Oracle 12c。这些视图中大约有 80 万条记录。

【问题讨论】:

    标签: sql oracle oracle12c


    【解决方案1】:

    你可以这样做:

    select id,
        name,
        address1,
        address2,
        city,
        state,
        cntry,
        job_title
    (select 
        a.id,
        nvl2(nvl(b.first_name, b.last_name),b.first_name||' '||b.last_name,null) Name,
        a.address1,
        a.address2,
        a.city,
        a.state,
        a.cntry,
        b.job_title,
        a.date
        row_number() over (partition by a.id order by a.date desc nulls last) rn
    from  
        view_a a left outer join
        view_b b
    on a.id = b.id
    and b.type = 'officer')
    where rn = 1
    order by date desc nulls last;
    

    【讨论】:

    • 此查询运行良好,但如果没有“Officer”类型,我不会获取记录,但我需要获取该列为空的记录
    • @CodingFreak 已修复。请立即尝试?
    【解决方案2】:

    以下也解决了问题:

    SELECT *
    FROM view_a a
       LEFT JOIN (SELECT name, job_title, id
               FROM (SELECT (first_name || ' ' || last_name) AS name,
                            job_title,
                            id,
                            ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC) rn
                       FROM view_b
                      WHERE TYPE = 'officer' AND id IS NOT NULL)
              WHERE rn = 1) b
           ON a.id = b.id
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2013-11-20
      • 2019-01-27
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      相关资源
      最近更新 更多