【问题标题】:SQL selection based on a particular field value基于特定字段值的 SQL 选择
【发布时间】:2018-08-31 20:29:36
【问题描述】:

我有一张人员表和他们的地址表。一个人可以有多个地址,但每个地址都有一个生效日期。

我想将人员和地址与他们的最大生效日期相关联,但我仍然坚持下面附上的查询。我得到的只是整个表格中的最大生效日期。请注意,这是 RPG,因此日期会像数字一样存储,例如今天将是 20180831,格式为 YYYYMMDD (2018-08-31)。

 SELECT 
   PERSON.ID, PERSON.NAME, ADDRESS.ID, ADDRESS.ADD1
 , ADDRESS.ADD2, ADDRESS.CITY 
   FROM PERSON
   LEFT JOIN 
     (
      SELECT * 
        FROM ADDRESS
          WHERE EFF_DATE IN (SELECT MAX(EFF_DATE) FROM ADDRESS)
     ) AS A
   ON PERSON.ID = A.ID

我知道问题出在 WHERE 子句中,但我画的是空白。

【问题讨论】:

标签: sql db2 rpg


【解决方案1】:

Impaler 有一个很好的解决方案,但我会通过像这样删除子查询来改进它:

with d as (
  select person_id, max(eff_date) as max_date 
    from address 
    group by person_id
)
select p.*
  from person p
  left join d on p.id = d.person_id
  left join address a 
    on p.id = a.person_id and a.eff_date = d.max_date

【讨论】:

    【解决方案2】:

    您需要在表person 和表address 之间使用LEFT OUTER JOIN,并添加地址必须与最后一个eff_date 匹配。

    您没有说数据库是什么,但考虑到您将其标记为 RPG,我认为是 DB2:

    with d as (
      select person_id, max(eff_date) as max_date 
        from address 
        group by person_id
    )
    select p.*
      from person p
      left join address a on p.id = a.person_id
        and (a.person_id, a.eff_date) in (
          select person_id, max_date from d
        )
    

    【讨论】:

    • 是的,抱歉,这是 DB2 的好猜测,“db2”没有任何标签。但是这个查询失败了“比较运算符 IN 无效”,我明白了,我会尝试在我的最后实现。
    • @WaleA。 . . .当然有db2的标签。你看了吗?
    【解决方案3】:

    IRL 我会查看最近的地址。

    create view recentaddress as 
        select a.* from address a 
          join ( 
           select address.id, max(eff_date) md from address
            group by address.id 
            ) as b 
            on a.id = b.id and a.eff_date= b.md    
    

    然后你可以简单地查询人员和最近的地址

    select * from person a left join recentaddress b on a.person_id = b.id
    

    或者你可以构建一个多合一的。

    select * from person a join (
    
            select a.* from address a 
              join ( 
               select address.id, max(eff_date) md from address
                group by address.id 
                ) as b 
                on a.id = b.id and a.eff_date= b.md    
    ) as address on a.person_id = address.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 2018-08-24
      • 2021-11-23
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      相关资源
      最近更新 更多