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 “发生了语法错误。”使用子查询时的主要内容,如果未能解决你的问题,请参考以下文章
gbase(Informix) pageHelper修改分页语句
gbase(Informix) pageHelper修改分页语句
gbase(Informix) pageHelper修改分页语句
在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异
在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数