首页 > 解决方案 > 为什么 UNION 不能在 CTE 或子查询中工作?

问题描述

我正在尝试通过 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了,结果没有改变。

更新:

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

查询 1 查询 2 查询 3

标签: sqlunionibm-midrangedb2-400

解决方案


你的陈述应该可以正常工作。这是我的 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;

给出:

场 1 场 2      
----------------------
第1行妈妈        
胆小鬼       
第2行爸爸        
罗瓦蒂米       

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

场 1 场 2      
----------------------
胆小鬼       
第1行妈妈        
第2行爸爸        
罗瓦蒂米       

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

场 1 场 2      
----------------------
胆小鬼       
第1行妈妈        
第2行爸爸        
罗瓦蒂米       

推荐阅读