Oracle SQL子查询(以及子,子查询)中的额外数据

时间:2020-02-10 09:00:34

标签: sql oracle

我有以下查询/子查询。我正在尝试从AOD表中的记录以及Employee Original Date表的First和Last中获取CIty,State和Zipcode。谁能提供有关如何从子查询中提取数据的指南?谢谢!

   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 :(得分:0)

如果您要求重写以简化查询,那么您可以考虑使用DENSE_RANK()分析函数来包括所有用于返回记录的匹配关系:

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)

答案 1 :(得分:0)

如果您只想要ADDRESS_ORIG_DATE中每个SSN的{​​{1}}中的最新行,那么我希望有窗口函数。

我猜想即使在最近的日期有重复,您也只需要一行,所以我建议EMPLOYEE_ORIG_DATE

ROW_NUMBER()
相关问题