Дополнительные данные из Oracle SQL подзапроса (и подзапроса) - PullRequest
1 голос
/ 10 февраля 2020

У меня есть следующий запрос / подзапрос. Я пытаюсь получить CIty, State и Zipcode из записи в таблице AOD, а также First и Last из таблицы Employee Original Date. Может ли кто-нибудь дать руководство о том, как извлечь данные из подзапроса? Спасибо!

   SELECT eod.FIRST_NAME
    ,eod.LAST_NAME
    ,eod.SSN
    ,aodf.SSN
    ,aodf.CITY
    ,aodf.STATE
    ,aodf.ZipCode

FROM EMPLOYEE_ORIG_DATE eod

JOIN

    (SELECT aod.ORIG_DATE
        ,aod.SSN
        ,aod.ADDRESS_KEY
        ,aod.Address_1 as AddressLine1
        ,aod.Address_2 as AddressLine2
        ,aod.City
        ,aod.State
        ,aod.Zip as ZipCode
        ,aod.Country as CountryCode
        ,aod.Telephone as HomeNumber
    FROM ADDRESS_ORIG_DATE aod
    INNER JOIN
        (SELECT SSN, MAX(ORIG_DATE) ORIG_DATE
            FROM ADDRESS_ORIG_DATE
            GROUP BY SSN) aod2
    ON aod.SSN = aod2.SSN 
    AND aod.ORIG_DATE = aod2.ORIG_DATE) aodf

ON eod.SSN = aodf.SSN
AND eod.ADRESS_KEY = aodf.ADDRESS_KEY
WHERE EMPLOYEE_ORIG_DATE.P_COMPANY_ID_I = 3149

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Если вы просто хотите получить самую последнюю строку из ADDRESS_ORIG_DATE для каждого SSN в EMPLOYEE_ORIG_DATE, то я бы ожидал, что оконные функции.

Я предполагаю, что вы просто хотите одну строку, даже если там дубликаты на самую последнюю дату, поэтому я рекомендую ROW_NUMBER():

SELECT eod.*, aod.*
FROM EMPLOYEE_ORIG_DATE eod JOIN
     (SELECT aod.*,
             ROW_NUMBER() OVER (PARTITION BY aod.SSN ORDER BY ORIG_DATE DESC) as seqnum
      FROM ADDRESS_ORIG_DATE aod
     ) aod
     ON aod.SSN = eod.SSN
WHERE aod.seqnum = 1 AND
      eod.P_COMPANY_ID_I = 3149
0 голосов
/ 10 февраля 2020

Если вы попросите переписать, чтобы упростить запрос, вы можете рассмотреть возможность использования функции DENSE_RANK() analyti c, чтобы включить все соответствующие связи для возвращаемых записей:

SELECT CITY, STATE, ZipCode, FIRST_NAME, LAST_NAME
  FROM
  (
  SELECT eod.FIRST_NAME,
         eod.LAST_NAME,
         eod.SSN,
         aod.SSN,
         aod.CITY,
         aod.STATE,
         aod.ZipCode,
         DENSE_RANK() OVER ( PARTITION BY SSN ORDER BY ORIG_DATE DESC ) ORIG_DATE
    FROM EMPLOYEE_ORIG_DATE eod
    JOIN ADDRESS_ORIG_DATE aod
      ON eod.SSN = aod.SSN
     AND eod.ADRESS_KEY = aod.ADDRESS_KEY
   WHERE P_COMPANY_ID_I = 3149
   )   
 WHERE ORIG_DATE = 1

, где PARTITION BY заменяет GROUP BY и ORIG_DATE DESC заменяет MAX(ORIG_DATE)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...