为啥“WITH”子句在 Informix 上会出现语法错误?
Posted
技术标签:
【中文标题】为啥“WITH”子句在 Informix 上会出现语法错误?【英文标题】:Why does a "WITH" clause give a syntax error on Informix?为什么“WITH”子句在 Informix 上会出现语法错误? 【发布时间】:2017-03-03 12:47:45 【问题描述】:我正在 Informix 上尝试类似于以下查询的查询,但每次都会收到语法错误(-201:“发生语法错误”)。
with a_qry (locationnames) as (SELECT * FROM TABLE(LIST'abc','xyz'))
select locationnames from a_qry;
有人可以帮忙吗?
【问题讨论】:
还有语法错误吗? Informix 不支持用于 CTE 的WITH
sintaxe。也许使用派生表或使用CONNECT BY
可以获得类似的结果?
@jarlh:它收到非信息性的“-201:发生语法错误”消息。这是 Informix 的一般“我不知道发生了什么”消息。
【参考方案1】:
Informix 14.10 及更高版本
Informix 14.10(2019 年 3 月发布)增加了对 WITH statement (Common Table Expressions) 的支持。
Informix 12.10 及更早版本
Informix 12.10 中的 Informix SELECT 语句的文档(这是提出此问题时的最新版本)不包括 WITH 子句,因为服务器不支持 WITH 子句和公用表表达式 (CTE) —严重的遗漏,但仍然是生活中的事实。
对于您的具体示例,您可以使用:
SELECT locationnames
FROM (SELECT * FROM TABLE(LIST'abc','xyz')(locationnames));
这会产生:
abc
xyz
当然,这里不需要子查询(您可以简单地使用SELECT * FROM TABLE(LIST'abc','xyz')(locationnames)
来获得相同的结果)。但是,一般而言,您必须完整地写出对 CTE 的每个引用,由此带来的风险是优化器无法发现共性,因此无法尽可能优化。
【讨论】:
【参考方案2】:您可以尝试使用临时表(不需要特殊权限)。
select * from (your query)
into temp myTmpTable;
select * from MyTmpTable;
【讨论】:
以上是关于为啥“WITH”子句在 Informix 上会出现语法错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这段代码在 64 位架构上会出现段错误,但在 32 位上却能正常工作?
Adobe Flex:为啥在某些浏览器上会出现间歇性 SecurityError 事件?