【问题标题】: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 的一般“我不知道发生了什么”消息。

标签: sql common-table-expression 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      相关资源
      最近更新 更多