【问题标题】:Oracle SQL: show max when record in table existsOracle SQL:当表中的记录存在时显示最大值
【发布时间】:2021-06-10 17:28:54
【问题描述】:

如果表中存在记录,我需要从链接到该人的最高地址记录中获取数据。

示例: John Doe 根本没有地址。报告仍需要带上 John Doe 的姓名,但没有任何地址。 John Doe 有 3 个地址,地址编号在增加。报告需要带上 John Doe 的姓名,并且只带上地址编号最高的地址。

我试过的代码:

Select *
from person p left join address a on p.id = a.person and a.addressnumber = (select max(a2.addressnumber) from address a2 where a2.a_peron = p.id)

Oracle 返回错误:ORA-01799:列不能外连接到 子查询 01799. 00000 - “列不能外连接到子查询”

我也试过

Select *
from person p left join address a1 on p.id = a1.person 
inner join (select a.person, max(a.addressnumber) MaxAdd, a.postcode, a.country from address a group by a.person, a.postcode, a.country) main on main.person = p.id and main.MaxAdd = a1.addressnumber

由于分组,这也不起作用。

我可能可以通过在 select 本身中使用子查询以及 case 语句来完成此操作,但我想避免这种情况,因为我将从地址中提取大量数据,因此这意味着每个 case 语句都带有子查询单列。

Oracle 11g - 11.2

有什么想法吗? :D

【问题讨论】:

    标签: sql oracle subquery max


    【解决方案1】:

    您可以使用ROW_NUMBER 对您的行进行排名,并且只保留最后一行:

    select *
    from person p
    left join 
    (
      select
        ad.*,
        row_number() over (partition by person order by addressnumber desc) as rn
      from address ad
    ) a on a.person = p.id and a.rn = 1;
    

    【讨论】:

      【解决方案2】:

      请试试这个:

      select * from 
      person p left join
      (select a.person, max(a.addressnumber) MaxAdd, a.postcode, a.country from address a 
      group by a.person, a.postcode, a.country) A
      on p.id=A.person 
      

      【讨论】:

        【解决方案3】:

        使用row_number():

        Select *
        from person p left join
             (select a.*,
                     row_number() over (partition by a.person order by a.addressnumber desc) as seqnum
              from address a
             ) a
             on p.id = a.person and seqnum = 1;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-04
          • 2021-04-01
          • 1970-01-01
          • 2015-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多