0

I have the following situation:

I have a script consisting of 6 selects joined by "UNION ALL".

From the CLP DB2 console, this script fails. Curiously, each query independently work, and even come to work if grouped in pairs. However, when I try with three or more, it fails.

So, my question is: is there is a limit for more that one UNION ALL?

My environment is:

  • Client. DB2 Connect server 10.1
  • zOS 390 (no idea what is the DB2 version on that side)
  • AIX 7.1

The query is like this (but three times )

SELECT
        ,'GG'
    ,varchar(right( '000000000000000' || rtrim(ltrim(eeee.zzzz)), 15), 15)  
        ,substr(char(right('**********'||char(left(replace(eeee.yyyy,' ','*')||'**********',10),10),10),10),1,7)
        ,eeee.kkkkk
        ,eeee.hhhhhh
            ,CASE WHEN hhhhhh='A5 ' THEN 'ARS' WHEN hhhhhh='A6 ' THEN 'AUD' WHEN hhhhhh='B5 ' THEN 'BRL' WHEN hhhhhh='U1 ' THEN 'GBP' WHEN hhhhhh='B9 ' THEN 'BND' WHEN hhhhhh='B6 ' THEN 'BNG' WHEN hhhhhh='C1 ' THEN 'CAD' WHEN hhhhhh='C3 ' THEN 'CLP' WHEN hhhhhh='C4 ' THEN 'CNY' WHEN hhhhhh='C5 ' THEN 'COP' WHEN hhhhhh='C7 ' THEN 'CRC' WHEN hhhhhh='L5 ' THEN 'HRK' WHEN hhhhhh='C9 ' THEN 'CYP' WHEN hhhhhh='X0 ' THEN 'CZK' WHEN hhhhhh='D0 ' THEN 'DKK' WHEN hhhhhh='D1 ' THEN 'DOP' WHEN hhhhhh='U0 ' THEN 'EGP' WHEN hhhhhh='E3 ' THEN 'EUR' WHEN hhhhhh='G5 ' THEN 'GTQ' WHEN hhhhhh='H0 ' THEN 'HTG' WHEN hhhhhh='H3 ' THEN 'HUF' WHEN hhhhhh='I1 ' THEN 'INR' WHEN hhhhhh='I2 ' THEN 'IDR' WHEN hhhhhh='K2 ' THEN 'WON' WHEN hhhhhh='L6 ' THEN 'LVL' WHEN hhhhhh='L7 ' THEN 'LTL' WHEN hhhhhh='M2 ' THEN 'MYR' WHEN hhhhhh='M6 ' THEN 'MXN' WHEN hhhhhh='I8 ' THEN 'ILS' WHEN hhhhhh='N2 ' THEN 'NZD' WHEN hhhhhh='N4 ' THEN 'NIO' WHEN hhhhhh='N6 ' THEN 'NOK' WHEN hhhhhh='T4 ' THEN 'XPF' WHEN hhhhhh='P0 ' THEN 'PKR' WHEN hhhhhh='P1 ' THEN 'PAB' WHEN hhhhhh='P3 ' THEN 'PEN' WHEN hhhhhh='P4 ' THEN 'PHP' WHEN hhhhhh='P5 ' THEN 'PLN' WHEN hhhhhh='R2 ' THEN 'RON' WHEN hhhhhh='U3 ' THEN 'RUB' WHEN hhhhhh='S0 ' THEN 'SAR' WHEN hhhhhh='R6 ' THEN 'RSD' WHEN hhhhhh='S2 ' THEN 'SGD' WHEN hhhhhh='K5 ' THEN 'SKK' WHEN hhhhhh='S4 ' THEN 'ZAR' WHEN hhhhhh='C2 ' THEN 'LKR' WHEN hhhhhh='S8 ' THEN 'SEK' WHEN hhhhhh='S9 ' THEN 'CHF' WHEN hhhhhh='T2 ' THEN 'THB' WHEN hhhhhh='T6 ' THEN 'TRL' WHEN hhhhhh='U4 ' THEN 'USD' WHEN hhhhhh='U6 ' THEN 'UAH' WHEN hhhhhh='U5 ' THEN 'AED' WHEN hhhhhh='U2 ' THEN 'UYU' WHEN hhhhhh='V0 ' THEN 'VEB' WHEN hhhhhh='V1 ' THEN 'VND' WHEN hhhhhh='J1 ' THEN 'JPY' ELSE '###' END
        ,  case when eeee.FCRCIDF='Y' then 1 else 0 end
        ,
                    CASE
                    WHEN SUBSTR(eeee.yyyy,7,1) = 'X' THEN 'X'       
                    WHEN SUBSTR(eeee.yyyy,4,2) = 'O' THEN 'O'       
                    WHEN SUBSTR(eeee.yyyy,4,2) = 'C' THEN 'C'       
                    WHEN SUBSTR(eeee.yyyy,4,2) = 'R' THEN 'R'       
                    WHEN eeee.lll = 'F' THEN 'F'            
                    WHEN eeee.ppp <> '' THEN 'D'            
                    WHEN eeee.rrr = 0 THEN '0'          
                    WHEN eeee.rrr <> eeee.ACINTOT THEN 'P'      
                    WHEN eeee.rrr = eeee.ACINTOT THEN '1'           
                    ELSE '*'                    
                    END
        ,1
        ,eeee.DCINISS
        ,0
        from  (SELECT ori.*,oric.tttt FROM www.SK1V01_CUSTOMER ori left OUTER JOIN www.SK1V01A_CUSTCUF oric
      ON ori.bbbb=oric.bbbb  and   ori.ICUSCNO=oric.ICUSCNO ) as aaaa
             ,www.SK1V02_OPENBILL eeee,www.SK1V41_OPENBILL kkkk
         where      aaaa.bbbb=eeee.bbbb
              and   aaaa.cagllic=eeee.cagllic
              and   aaaa.icuscno=eeee.icuscno
mustaccio
  • 18,234
  • 16
  • 48
  • 57
agg
  • 1
  • 1
  • Do you care to tell us what error you get, or should we start guessing? – mustaccio Jul 10 '15 at 15:14
  • sorry for that: it was sql0104n... – agg Jul 10 '15 at 15:45
  • SQL0104N means there is some syntax error in your query. Without seeing the actual query I'm afraid that's all I can tell you. There certainly is no limit to how many `UNION`s you can have in your query, as long as the query text does not exceed 2 MB. – mustaccio Jul 10 '15 at 16:05

1 Answers1

0

Without the entire statement its pretty hard to determine exact reasons. An given that just one portion is so long & poorly formatted, I'm not sure we'd want to dig through it all. But I can suggest a few approaches that may help resolve your problem.

Simplest part first. In practically any computer language, well formatted code helps you see the structure of what's going on. It may also help you spot the differences between your queries. (Perhaps you know this, & your code merely lost its formatting when you tried to post it.)

When trying to UNION multiple complex queries, it's not uncommon to have column inconsistencies among the queries. You might have missing or extra columns, or columns out of order. But it's possible some of your column expressions are evaluating to different types. You might want to cast() those expressions, or use type conversion functions, just to be sure.

There's so much going on here. Try testing with a version where you comment out large chunks of code, same on each major subquery, until you find which part is causing the problem.

You have a ridiculously long CASE expression on hhhhhh. Why don't you put these value pairs into a lookup table that you can join to.

Try using a module approach, just as you should when writing a large program. You could create a view for each of the major queries, then UNION them together. (Some developers use layers of views like layers of modular code).

Metadata about your views is available in the database catalog views. This means you could write a query to compare the attributes of the columns in your set of union views.

WarrenT
  • 4,502
  • 19
  • 27