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.