Common Table Expressions
Temporary table definitions as work files
A common table expression (CTE) can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE statement. A CTE is similar to a temporary work file--something that is not stored as a permanent object, used only for the duration of the query. This example is a list of nested CTE's building a temporary file that will be used to output a report. The syntax WITH (name) AS identifies the selections as a function of the CTE.
Exec SQL
Drop Table QTemp/VEND99;
Exec SQL
Create Table QTemp/VEND99 (
Vendor Char( 12 ) CCSID 37 Not Null Default '',
Title Char( 40 ) CCSID 37 Not Null Default '',
VATRef Char( 20 ) CCSID 37 Not Null Default '',
TxRef1 Char( 18 ) CCSID 37 Not Null Default '',
AdrAtn Char( 80 ) CCSID 37 Not Null Default '',
Add1 Char( 35 ) CCSID 37 Not Null Default '',
Add2 Char( 35 ) CCSID 37 Not Null Default '',
Add3 Char( 35 ) CCSID 37 Not Null Default '',
Add4 Char( 35 ) CCSID 37 Not Null Default '',
Add5 Char( 35 ) CCSID 37 Not Null Default '',
PostCode Char( 12 ) CCSID 37 Not Null Default '',
Amount Numeric( 16, 2 ) Not Null Default 0
);
Exec SQL
Insert Into QTemp/VEND99
with Cancelled As (
Select a.el1, a.DocCode, a.DocNum, a.statpayint, a.el2,
a.el3, b.Yr, a.valueHome, b.Period
From oas_docline a, oas_docHead b
Where a.cmpCode = b.cmpCode and a.docCode = b.docCode and
a.docNum = b.DocNum and
a.docCode = 'CANC' and
Substr( el3, 1, 1 ) = 'V' and
b.Yr = :Year And b.Period Between 1 And 12
And b.docDate Between :FromDate And :ToDate
And subString(a.el1,1,3) = :Company
),
Payments As (
Select a.el1, a.docCode, a.DocNum, a.statPayInt,
a.el2, a.el3, b.yr, a.valueHome, b.Period
From oas_docline a, oas_dochead b
Where a.cmpCode = b.cmpCode and a.docCode = b.docCode and
a.docNum = b.DocNum and
a.docCode In ( :Dtype1, :DType2 )
And Substr( a.el3, 1, 1 ) = 'V'
And b.YR = :Year And b.Period Between 1 And 12
And b.docDate Between :FromDate And :ToDate
And subString(a.el1,1,3) = :Company
),
Unmatched_Payments As (
Select a.*
From Payments a
Left Join Cancelled b
On a.el1 = b.el1
And a.el2 = b.el2
And a.el3 = b.el3
And a.statPayInt = b.statPayInt
),
Unmatched_Summary As (
Select a.el1, a.el3, Cast( Sum( a.valuehome ) As Dec( 16, 2 ))
as Amount
From Unmatched_Payments a
Group By a.el1, a.el3
Order By a.el1, a.el3
),
Report_Data As (
Select a.el1, a.el3, b.VAT,
Case When ( b.federaltax = ' ' )
Then b.socialSec
Else b.federaltax
End As txRef1,
a.Amount
From Unmatched_Summary a
Join oas_elmTaxes b
On a.el3 = b.elmcode
Where a.Amount >= 600
and b.elmLevel = 3
And b.Vat In ( ' ', 'I' )
And b.cmpcode = :dftcomp
),
Output_File As (
Select substring(a.el3,1,12) as Vendor,
b.name, a.VAT, a.TxRef1,
b.name as AdrAtn,
b.Add1, b.Add2, b.Add3, b.Add4, b.Add5,
b.PostCode, a.Amount
From Report_Data a
Join oas_elmAddrList b
On a.el3 = b.elmcode
Where b.CmpCode = :dftComp
and b.elmlevel = 3
)
Select * From Output_File;
It is permissible to have multiple CTEs in one query. The example above may be termed a nested CTE since, one CTE is used to reference another CTE. A CTE can also reference itself, resulting in a recursive CTE.