为啥“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 上会出现语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

Informix:IN 子句中的项目数量限制?

为啥这段代码在 64 位架构上会出现段错误,但在 32 位上却能正常工作?

Adobe Flex:为啥在某些浏览器上会出现间歇性 SecurityError 事件?

为啥这个基本链表可以在 MacOS 上工作,但在 Linux 上会出现段错误

如何在 IN 子句 sql informix 中使用参数

如果代码正确,为啥我在 OK 按钮上会出现这些错误? [关闭]