使用子查询时INTERBASE bad参数编号错误

问题描述 投票:0回答:2

我一直致力于从 SQLITE 切换到 Interbase 数据库。我遇到的问题之一是“错误的参数号”错误。因此,我回到 Embarcadero 提供的示例数据库之一(EMPLOYEE)尝试各种 SQL 命令来重现该问题。

所以这里有一个场景:我想要一个查询,给出特定客户的所有销售超过预先指定金额的平均销售额。因此,这是一个适用于此的查询:

SELECT AVG(TOTAL_VALUE) AS AvgSales
FROM SALES
WHERE TOTAL_VALUE > :TOTAL_VALUE
  AND CUST_NO = :CUSTNO

现在,我想将该平均值存储在表中。但你怎么能这么做呢?这是我尝试过的:

UPDATE <table>
SET <Column> = (SELECT AVG(TOTAL_VALUE) AS AvgSales
                FROM SALES
                WHERE TOTAL_VALUE > :TOTAL_VALUE
                  AND CUST_NO = :CUST_NO)

但是当你尝试执行它时,它会给出错误消息“错误的参数号”

如果您对这两个参数进行硬编码,则效果很好:

UPDATE <table>
SET <Column> = (SELECT AVG(TOTAL_VALUE) AS AvgSales
                FROM SALES
                WHERE TOTAL_VALUE > 10000
                  AND CUST_NO = 1001)

经过更多实验,在我看来,子查询中的任何参数都会生成相同的错误消息而不是执行。例如,这也会生成相同的错误消息(并且对参数进行硬编码):

SELECT AMT
FROM
    (SELECT AVG(TOTAL_VALUE) AS AvgSales
     FROM  SALES
     WHERE TOTAL_VALUE > :TOTAL_VALUE
       AND CUST_NO = :CUSTNO
    ) X(Amt)

那么,如何将这样的值存储在 Interbase 表中?

delphi syntax-error c++builder interbase
2个回答
0
投票

不幸的是,我们无法重现运行我们没有的源代码的问题。

无论如何,在这种情况下,查看您的查询,您可以简单地分两步拆分并运行查询:

  1. 选择。
  2. 更新。

0
投票

在 SQL-server 中,我们可以通过使用变量来回避这个问题:

declare @i int
select @i = :CUST_NO
select * from sales where CUST_NO  = @i
© www.soinside.com 2019 - 2024. All rights reserved.