具有三个或更多选择的 UNION ALL 的正确语句

Posted

技术标签:

【中文标题】具有三个或更多选择的 UNION ALL 的正确语句【英文标题】:Correct statement for UNION ALL with three or more selects 【发布时间】:2015-09-29 08:45:39 【问题描述】:

我有以下情况:

我有一个由 6 个选择组成的脚本,由“UNION ALL”连接。

从 CLP DB2 控制台,此脚本失败。奇怪的是,每个查询都是独立工作的,如果成对分组,甚至会开始工作。但是,当我尝试使用三个或更多时,它会失败。

所以,我的问题是:是否有多个 UNION ALL 的限制?

我的环境是:

客户端。 DB2 Connect 服务器 10.1 zOS 390(不知道那边的 DB2 版本是什么) AIX 7.1

查询是这样的(不过是三次)

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

【问题讨论】:

您愿意告诉我们您遇到了什么错误,还是我们应该开始猜测? 很抱歉:它是 sql0104n... SQL0104N 表示您的查询中有一些语法错误。在没有看到实际查询的情况下,恐怕我只能告诉你。只要查询文本不超过 2 MB,您的查询中可以有多少 UNIONs 肯定是没有限制的。 【参考方案1】:

没有完整的陈述,很难确定确切的原因。鉴于只有一个部分太长且格式不正确,我不确定我们是否想要全部挖掘。但我可以建议一些可能有助于解决您的问题的方法。

先说最简单的部分。在几乎任何计算机语言中,格式良好的代码都可以帮助您了解正在发生的事情的结构。它还可以帮助您发现查询之间的差异。 (也许您知道这一点,并且您的代码只是在您尝试发布时丢失了格式。)

尝试联合多个复杂查询时,查询之间出现列不一致的情况并不少见。您可能缺少或多余的列,或者列乱序。但是您的某些列表达式可能正在评估不同的类型。您可能想要 cast() 那些表达式,或者使用类型转换函数,只是为了确定。

这里发生了很多事情。尝试使用注释掉大块代码的版本进行测试,每个主要子查询都相同,直到找到导致问题的部分。

你在 hhhhhh 上有一个可笑的长 CASE 表达式。为什么不将这些值对放入可以加入的查找表中。

尝试使用模块方法,就像编写大型程序时一样。您可以为每个主要查询创建一个视图,然后将它们联合在一起。 (一些开发人员使用视图层,如模块化代码层)。

关于您的视图的元数据可在数据库目录视图中找到。这意味着您可以编写一个查询来比较您的联合视图集中列的属性。

【讨论】:

以上是关于具有三个或更多选择的 UNION ALL 的正确语句的主要内容,如果未能解决你的问题,请参考以下文章

UNION ALL vs UNION 用于更新/返回+选择?

UNION ALL UNION

oracle union 和 union all

sql中Union和union all的使用

mysql中 union连接

使用 Union All 优化 SQL 查询