Informix “发生了语法错误。”使用子查询时

Posted

技术标签:

【中文标题】Informix “发生了语法错误。”使用子查询时【英文标题】:Informix "A syntax error has occurred." when using subquery 【发布时间】:2019-12-16 16:15:56 【问题描述】:

以下两个查询有效:

SELECT SUM(actdtmahi+actdtmahd+actdtmahv) AS saldo
FROM actdt 
WHERE actdtcage=116437 AND actdtmrcb=0 AND actdtccic=55204

还有

SELECT FIRST 1 acbccccic FROM acbcc 
WhERE (acbccscic=4 OR acbccscic=5) AND 
    acbccccic IN (SELECT acbcaccic FROM acbca WHERE acbcacage=116437)
ORDER BY acbccccic DESC

但是,如果我尝试将它们加入一个查询中,我会收到“发生语法错误”

SELECT SUM(actdtmahi+actdtmahd+actdtmahv) AS saldo
FROM actdt 
WHERE actdtcage=116437 AND actdtmrcb=0 AND 
    actdtccic IN (SELECT FIRST 1 acbccccic FROM acbcc 
        WHERE (acbccscic=4 OR acbccscic=5) AND 
        acbccccic IN (SELECT acbcaccic FROM acbca WHERE acbcacage=116437)
        ORDER BY acbccccic DESC)

为什么?

【问题讨论】:

我认为 Informix 不允许在子查询中使用 FIRST 【参考方案1】:

我认为 Informix 不允许在子查询中使用 FIRST。改用MAX()

actdtccic IN (SELECT MAX(acbccccic)
              FROM acbcc 
              WHERE acbccscic IN (4, 5) AND 
                    acbccccic IN (SELECT acbcaccic FROM acbca WHERE acbcacage=116437)
             )

另外,您可以使用= 而不是IN

【讨论】:

您可能知道,FIRST 并不表示任何确定的值(不是最小值或最大值,也不一定是第一次输入或最近输入的值,或者……)。使用 IN 避免了来自 'sub-query did not return just one row. 的错误。删除FIRST 1 可能会完成这项工作;使用 DISTINCT 而不是 FIRST 1 可能也可以。我怀疑一些 IN 子句也可以用常规的内部连接代替。 @JonathanLeffler 。 . .在带有FIRST 的子查询中有一个ORDER BY,假设我没有错误地读取查询。 你不是——我是(误读了查询)。在这种情况下,MAX 操作是正确的,因为 ORDER BY 有 DESC 作为它的一部分。 谢谢!我使用INNER JOIN 合并了所有内容,还使用了MAX() 函数

以上是关于Informix “发生了语法错误。”使用子查询时的主要内容,如果未能解决你的问题,请参考以下文章

带有 FIRST 选项的 Informix 子查询

gbase(Informix) pageHelper修改分页语句

gbase(Informix) pageHelper修改分页语句

gbase(Informix) pageHelper修改分页语句

在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异

在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数