sql - 为什么 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
了,结果没有改变。
更新:
由于人们一直认为我没有显示实际查询,因此我添加了屏幕截图。这是第一个查询工作正常,第二个查询失败:
解决方案
你的陈述应该可以正常工作。这是我的 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行爸爸 罗瓦蒂米
推荐阅读
- react-native - 当我按下 Ctrl + 空格时,Visual Studio Code 花费太多时间来进行智能感知?
- linkedin - 在用户许可的情况下以编程方式读取用户的 LinkedIn 用户资料
- excel - 如何使我的 Excel 工作表自动更新以根据 VBA 中的单元格值触发电子邮件发送?
- velocity - 如何将`#evaluate`的结果分配给变量?
- python - Python Flask:连接函数无法处理主机名中的变量
- javascript - Cordova:Android 目标:未安装 avdmanager:命令失败,退出代码为 1
- locust - 获取master中的蝗虫数和用户数
- opentok - OpenTok 消息:“OT.Subscriber is not connected cannot getStats”,名称:“OT_NOT_CONNECTED”
- javascript - Facebook PHP SDK 从 3.21 版升级到 5.7.1 版
- android - Android:通过 Activity 中的 LiveData 和 ViewModel 观察 Room DB