我正在尝试通过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
,但结果没有变化。
更新:
由于人们一直认为我没有显示实际查询,因此添加了屏幕截图。这是第一个查询正常运行,而后两个则失败:
答案 0 :(得分:1)
在7.2版上对我来说效果很好
with cte as (
select pmco#, pmmanf
from dtdata.pdpmast
union
select pmco#, pmmanf
from devqdata.pdpmast
)
select * from cte;
注意:如果您没有重复数据或不关心重复数据,请使用UNION ALL
。 UNION
消除了重复项,如果没有任何手段,则会浪费大量处理资源。
答案 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,或任何其他版本)。据我所知,真正的旧版本是问题所在。