Выбор SQL на основе определенного значения поля - PullRequest
0 голосов
/ 31 августа 2018

У меня есть таблица людей и таблица их адресов. У человека может быть несколько адресов, но к каждому адресу прикреплена дата вступления в силу.

Я хочу связать людей и адреса с их наиболее эффективной датой вступления в силу, и я застрял с моим запросом, прикрепленным ниже. Я получаю только максимальную эффективную дату во всей таблице. Обратите внимание, что это RPG, поэтому даты хранятся в виде чисел, например, сегодня будет 20180831 в формате ГГГГММДД (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, но я рисую пробел.

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

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
0 голосов
/ 04 сентября 2018

У 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
0 голосов
/ 31 августа 2018

Вам необходимо использовать LEFT OUTER JOIN между таблицей person и таблицей address, добавив, что адрес должен совпадать с последней датой 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
    )
...