为什么UNION在CTE或子查询中不起作用?

时间:2019-01-03 18:13:49

标签: sql union ibm-midrange db2-400

我正在尝试通过System i Navigator运行查询,该查询是从联合的合并结果中选择的。

这很好:

SELECT AF15VC FROM DB.AF
UNION
SELECT AF15VC FROM BATCH.AFM

那为什么不起作用?

WITH CTE AS (
    SELECT AF15VC FROM DB.AF
    UNION
    SELECT AF15VC FROM BATCH.AFM
)
SELECT *
FROM CTE

那为什么不起作用?

SELECT *
FROM
    (SELECT AF15VC FROM DB.AF
     UNION
     SELECT AF15VC FROM BATCH.AFM
    ) AS AF

在两种情况下,我都会收到此错误:

  

SQL状态:42601

     

供应商代码:-199

     

消息:[SQL0199]

     

关键字UNION   没想到。有效令牌:)。原因。 。 。 。 。 :关键字UNION   没想到这里。在关键字UNION处检测到语法错误。   有效令牌的部分列表是)。此列表假设   语句是正确的,直到意外的关键字为止。错误可能是   该语句的前面,但是该语句的语法似乎是   到目前为止有效。恢复。 。 。 :检查SQL语句   在指定关键字的区域中。冒号或SQL分隔符可能是   失踪。 SQL要求保留字要在分隔时被定界   用作名称。更正该SQL语句,然后重试该请求。

我也尝试了UNION ALL,但结果没有变化。

更新

由于人们一直认为我没有显示实际查询,因此添加了屏幕截图。这是第一个查询正常运行,而后两个则失败:

query 1 query 2 query 3

3 个答案:

答案 0 :(得分:1)

在7.2版上对我来说效果很好

with cte as (
select pmco#, pmmanf
from dtdata.pdpmast
union 
select pmco#, pmmanf
from devqdata.pdpmast
)
select * from cte;

注意:如果您没有重复数据或不关心重复数据,请使用UNION ALLUNION消除了重复项,如果没有任何手段,则会浪费大量处理资源。

答案 1 :(得分:1)

您的声明应该可以正常工作。这是我的IBM i在v7.2上进行的测试,但根据我能找到的文档,它应该在v7.1上也可以运行,或者至少一直返回到v5r3。

create table tablea
  (field1    Char(10),
   field2    Char(10));
create table tableb
  (field1    Char(10),
   field2    Char(10));
insert into tablea
  values ('row1', 'mama'),
         ('row2', 'papa');
insert into tableb
  values ('rowa', 'timmy'),
         ('rowb', 'sissy');

然后

select * from tablea
union
select * from tableb;

给予:

FIELD1      FIELD2      
------------------------
row1        mama        
rowb        sissy       
row2        papa        
rowa        timmy       

with cte as (
  select * from tablea
  union
  select * from tableb)
select * from cte;

给予

FIELD1      FIELD2      
------------------------
rowb        sissy       
row1        mama        
row2        papa        
rowa        timmy       

select * 
from (
  select * from tablea
  union
  select * from tableb) a

给予

FIELD1      FIELD2      
------------------------
rowb        sissy       
row1        mama        
row2        papa        
rowa        timmy       

答案 2 :(得分:1)

好吧,显然该系统实际上是5.1版,而不是我在评论中提到的7.1版。我将我的System i Navigator版本误认为数据库引擎版本(或OS,或任何其他版本)。据我所知,真正的旧版本是问题所在。