Maybe I am beating a dead horse here, but I use CTE's daily. Today I was asked to look into self service address changes that were pending approval to provide a list of address changes that have not been processed.
First I created a SQL statement that allowed me to identify active employee's with pending address changes on the HR_ADDR_CHG_DAT.
This is what I came up with:
SELECT *
FROM PS_HR_ADDR_CHG_DAT A
WHERE ACTION_DT_SS = (
SELECT MAX(B.ACTION_DT_SS)
FROM PS_HR_ADDR_CHG_DAT B
WHERE A.EMPLID = B.EMPLID
AND A.ADDRESS_TYPE = B.ADDRESS_TYPE
AND B.ACTION_DT_SS <= TO_DATE(SYSDATE))
AND A.EFFSEQ = (
SELECT MAX(Z.EFFSEQ)
FROM PS_HR_ADDR_CHG_DAT Z
WHERE A.EMPLID = Z.EMPLID
AND A.ADDRESS_TYPE = Z.ADDRESS_TYPE
AND A.ACTION_DT_SS = Z.ACTION_DT_SS)
AND A.ADDRESS_TYPE = 'HOME'
AND A.SS_STAT_INDICATOR = 'M'
AND EXISTS(
SELECT 'X'
FROM PS_EMPLOYEES X
WHERE A.EMPLID = X.EMPLID )
Then I knew I wanted to compare the results of this SQL with current address data that can be found in the PS_ADDRESSES4_VW. So rather then joining this record into the SQL above I used a CTE to create a dynamic view and joined the current address record to the CTE.
WITH ADDR_CHG AS (
SELECT *
FROM PS_HR_ADDR_CHG_DAT A
WHERE ACTION_DT_SS = (
SELECT MAX(B.ACTION_DT_SS)
FROM PS_HR_ADDR_CHG_DAT B
WHERE A.EMPLID = B.EMPLID
AND A.ADDRESS_TYPE = B.ADDRESS_TYPE
AND B.ACTION_DT_SS <= TO_DATE(SYSDATE))
AND A.EFFSEQ = (
SELECT MAX(Z.EFFSEQ)
FROM PS_HR_ADDR_CHG_DAT Z
WHERE A.EMPLID = Z.EMPLID
AND A.ADDRESS_TYPE = Z.ADDRESS_TYPE
AND A.ACTION_DT_SS = Z.ACTION_DT_SS)
AND A.ADDRESS_TYPE = 'HOME'
AND A.SS_STAT_INDICATOR = 'M'
AND EXISTS(
SELECT 'X'
FROM PS_ZZ_IDM_DATA X
WHERE A.EMPLID = X.EMPLID2
AND X.HR_STATUS IN ('A','L')))
SELECT SS.EMPLID
, SS.effseq
, SS.ADDRESS_TYPE
, SS.ADDRESS1 SS_ADDRESS1
, CUR.ADDRESS1
, SS.ADDRESS2 SS_ADDRESS2
, CUR.ADDRESS2
, SS.CITY SS_CITY
, CUR.CITY
, SS.POSTAL SS_POSTAL
, CUR.POSTAL
, SS.STATE SS_STATE
, CUR.STATE
FROM ADDR_CHG SS
, PS_ADDRESSES4_VW CUR
WHERE CUR.EMPLID = SS.EMPLID
AND CUR.ADDRESS_TYPE = 'HOME'
AND (UPPER(SS.ADDRESS1) <> UPPER(CUR.ADDRESS1)
OR UPPER(SS.ADDRESS2) <> UPPER(CUR.ADDRESS2)
OR UPPER(SS.CITY) <> UPPER(CUR.CITY)
OR UPPER(SS.STATE) <> UPPER(CUR.STATE)
OR SS.POSTAL <> CUR.POSTAL)
This simplifies the SQL in my opinion.
No comments:
Post a Comment