【问题标题】:Informix "A syntax error has occurred." when using subqueryInformix “发生了语法错误。”使用子查询时
【发布时间】: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

标签: sql syntax-error informix


【解决方案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() 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多