Oracle SQL Подзапрос с функцией MAX в подзапросе - PullRequest
0 голосов
/ 06 февраля 2020

Я работаю над Oracle БД с Oracle SQL Разработчиком. У меня есть два запроса. Мне нужно изменить Query # 1, чтобы он извлекал данные демографического адреса c из Query # 2. Я считаю, что мне нужно вставить Query # 2 в Query # 1, чтобы это был ссылочный подзапрос. Запрос № 2 выбирает данные из таблицы ADDRESS_EFF_DATE, в которой хранятся записи демографических адресов. У него есть запись для каждого изменения сотрудником своего адреса, а в столбце EFF_DATE отображается дата записи. Мне нужно получить самые последние данные, таким образом, подзапрос. Я не уверен, как это сделать.

Запрос № 1

SELECT cd.ONECODE as "Client One Code"
        ,cs.REAL_SSN as "Employee SSN"
        ,cs.REAL_SSN as "Member SSN"
        ,'Subscriber' as "Person Type"
        ,eed.LAST_NAME as "Last Name"
        ,eed.FIRST_NAME as "First Name"
        ,eed.BIRTHDATE as MemberDOB
        ,eed.SEX as MemberGender
        ,aed.Address_1 as AddressLine1
        ,aed.Address_2 as AddressLine2
        ,aed.City
        ,aed.State
        ,aed.Zip as ZipCode
        ,aed.Country as CountryCode
        ,aed.Telephone as HomeNumber
        ,eed.EMAIL_ADDRESS as "Employee Emaill Address"
        ,eed.EFF_DATE as "Date Last Actively at Work"
        ,eed.LATEST_HIRE_DATE as "Employee Date of Hire"
        ,eed.LAST_TERM_DATE as "Employee Date of Termination"
        ,mcemd.RATE_1 as "Employee Salary"

        /*,MV_COMB_EMP_MAX_DTS.RATE_1 as "Employee Salary"*/

    FROM

    EMPLOYEE_EFF_DATE eed

    INNER JOIN ADDRESS_EFF_DATE aed 
        ON eed.ssn = aed.ssn
    INNER JOIN COMP_SSN cs
        ON cs.ssn = eed.ssn
    INNER JOIN COMPANY_DETAIL cd
        ON eed.P_COMPANY_ID_I = cd.COMPANY_ID
    INNER JOIN COMPANY_EMPLOYMENT_DATA ced
        ON eed.SSN = ced.SSN
    INNER JOIN MV_COMB_EMP_MAX_DTS mcemd
        ON eed.SSN = mcemd.SSN
    WHERE eed.P_COMPANY_ID_I = 4029
    AND aed.ADDRESS_KEY = 0

Запрос № 2

   SELECT aed.EFF_DATE
    ,aed.SSN
    ,aed.ADDRESS_KEY
    ,aed.Address_1 as AddressLine1
    ,aed.Address_2 as AddressLine2
    ,aed.City
    ,aed.State
    ,aed.Zip as ZipCode
    ,aed.Country as CountryCode
    ,aed.Telephone as HomeNumber
FROM ADDRESS_EFF_DATE aed
INNER JOIN (
    SELECT SSN, ADDRESS_KEY, MAX(EFF_DATE) Eff_Date
    FROM ADDRESS_EFF_DATE
    GROUP BY SSN, ADDRESS_KEY
) aed2 ON aed.SSN = aed2.SSN AND aed.EFF_DATE = aed2.Eff_Date

Ответы [ 2 ]

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

Поскольку у вас в первом запросе ADDRESS_EFF_DATE и вы хотите получить последний адрес, который сотрудник переместил, вы можете сделать это в одном запросе с помощью DENSE_RANK. Я предлагаю реализовать это так:

SELECT a."Client One Code",
   a."Employee SSN" ,
   a."Member SSN",
   a."Person Type",
   a."Last Name",
   a."First Name",
   a.MemberDOB,
   a.MemberGender,
   a.AddressLine1,
   a.AddressLine2,
   a.City,
   a.State,
   a.ZipCode,
   a.CountryCode,
   a.HomeNumber,
   a."Employee Emaill Address",
   a."Date Last Actively at Work",
   a."Employee Date of Hire",
   a."Employee Date of Termination",
   a."Employee Salary" FROM (
SELECT cd.ONECODE as "Client One Code"
    ,cs.REAL_SSN as "Employee SSN"
    ,cs.REAL_SSN as "Member SSN"
    ,'Subscriber' as "Person Type"
    ,eed.LAST_NAME as "Last Name"
    ,eed.FIRST_NAME as "First Name"
    ,eed.BIRTHDATE as MemberDOB
    ,eed.SEX as MemberGender
    ,aed.Address_1 as AddressLine1
    ,aed.Address_2 as AddressLine2
    ,aed.City
    ,aed.State
    ,aed.Zip as ZipCode
    ,aed.Country as CountryCode
    ,aed.Telephone as HomeNumber
    ,eed.EMAIL_ADDRESS as "Employee Emaill Address"
    ,eed.EFF_DATE as "Date Last Actively at Work"
    ,eed.LATEST_HIRE_DATE as "Employee Date of Hire"
    ,eed.LAST_TERM_DATE as "Employee Date of Termination"
    ,mcemd.RATE_1 as "Employee Salary"
    ,DENSE_RANK()  OVER (PARTITION BY eed.ssn ORDER BY aed.EFF_DATE DESC) AS drank
    /*,MV_COMB_EMP_MAX_DTS.RATE_1 as "Employee Salary"*/
FROM
EMPLOYEE_EFF_DATE eed
INNER JOIN ADDRESS_EFF_DATE aed 
    ON eed.ssn = aed.ssn
INNER JOIN COMP_SSN cs
    ON cs.ssn = eed.ssn
INNER JOIN COMPANY_DETAIL cd
    ON eed.P_COMPANY_ID_I = cd.COMPANY_ID
INNER JOIN COMPANY_EMPLOYMENT_DATA ced
    ON eed.SSN = ced.SSN
INNER JOIN MV_COMB_EMP_MAX_DTS mcemd
    ON eed.SSN = mcemd.SSN
WHERE eed.P_COMPANY_ID_I = 4029
AND aed.ADDRESS_KEY = 0) a 
WHERE drank=1
0 голосов
/ 06 февраля 2020

Самый простой (ленивый) способ - объединить эти два запроса в виде «табличных выражений». Например:

select
  x.col1,
  y.col2
from (
  -- query #1 here
) x
join (
  -- query #2 here
) y 
on x.col1 = y.col2 -- join predicate here

Вы также можете использовать CTE, если хотите,

В качестве альтернативы, вы можете попробовать объединить оба запроса в один; это может привести к повышению производительности, но больше работы с точки зрения кодирования и отладки.

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