One of the easiest and powerful keywords I found in SQL, for debugging or for writing complex queries is the WITH keyword. Using this we can define multiple blocks and perform
different operations between the defined blocks and store the result in a different block. It should be clear with the below query. Here I have defined
different blocks as SRC,TGT, JN, SRC1, SRC2, EXTRA, MISSING.
(In the below SQL I am trying to validate some of the column values for validity. The values in Target have been loaded from the ETL job. So I am generating the source records using the different operations as was required by business. Here I will be joining the source table : table_1 with a reference table table_2 for a particular batch. The result obtained will be further joined with table_3 to fetch additional columns required. Finally the generated values from source are compared with the target if any EXTRA or MISSING records are there.)
The different functions performed by the blocks are :
SRC – Extracts result of table_1 for a particular batch. (Source table)
TGT – Extracts result of table_2 for a particular batch.
JN – Joins results of SRC and TGT and puts some filter.
SRC1 – Joins result of JN with table_3.
TGT1 – Extracts result of table_4 (target table).
EXTRA – finds records which are in Target but not in Source.
MISSING – finds records which are in Source but not in target.
WITH SRC AS
(SELECT DATEIG,VENDOR_NUM,POSEQNC_NUM,WKSTSQC_NUM,CONCAT(VENDOR_NUM,POSEQNC_NUM) AS PO_NUM FROM table_1 WHERE
BATCH_TS = TIMESTAMP'2012-11-25 04:01:00')
,TGT AS
(
SELECT DATEDOCK,VENDOR_NUM,POSEQNC_NUM,WKSTSQC_NUM FROM table_2 WHERE
BATCH_TS = TIMESTAMP'2012-11-25 04:01:00'
),
JN AS
(
SELECT CASE WHEN DATEIG IS NULL THEN DATEDOCK ELSE DATEIG END AS IN_GATE_DATE FROM SRC LEFT JOIN TGT ON
SRC.VENDOR_NUM = TGT.VENDOR_NUM AND
SRC.POSEQNC_NUM = TGT.POSEQNC_NUM AND
SRC.WKSTSQC_NUM = TGT.WKSTSQC_NUM
--WHERE PO_NUM = '15046327' AND SRC.WKSTSQC_NUM IN ('0001','0005','0009','0013','0017','0002','0006')
)
,SRC1 AS
(
SELECT
IN_GATE_DATE,DAY_ID AS IN_GATE_DATE_ID FROM JN LEFT OUTER JOIN table_3 ON
IN_GATE_DATE = DAY_DATE
)
,TGT1 AS
(SELECT IN_GATE_DATE,IN_GATE_DATE_ID,'TARGET' AS DESCR FROM table_4
--WHERE PURCHASE_ORDER_NUM = '15046327' AND WORKSHEET_NUM IN ('0001','0005','0009','0013','0017','0002','0006')
)
,EXTRA AS
(SELECT IN_GATE_DATE,IN_GATE_DATE_ID FROM TGT1 MINUS SELECT IN_GATE_DATE,IN_GATE_DATE_ID FROM SRC1)
,
MISSING AS
(SELECT IN_GATE_DATE,IN_GATE_DATE_ID FROM SRC1 MINUS SELECT IN_GATE_DATE,IN_GATE_DATE_ID FROM TGT1)
SELECT IN_GATE_DATE,IN_GATE_DATE_ID,'EXTRA' AS DESCR FROM EXTRA
UNION
SELECT IN_GATE_DATE,IN_GATE_DATE_ID,'MISSING' AS DESCR FROM MISSING