为什么我会得到这个语法逻辑错误?

4
我有一个基本的Windows表单应用程序,它连接并显示数据库。我想使用两个表中的信息更新其中一个数据库。
    UPDATE account AS a
    SET accrued = (a.accrued + ((p.intrate/365)*balance))
    FROM customer c JOIN product p
    ON p.prodid = a.prodid
    WHERE c.custid = a.custid AND active = 1

这在数据库浏览器中有效。

using (SQLiteCommand cmd = connAccount.CreateCommand())
{
    // adds customers details to the database
    cmd.CommandText = @"UPDATE account AS a SET accrued = (a.accrued + ((p.intrate / 365) * balance)) FROM customer c JOIN product p ON p.prodid = a.prodid WHERE c.custid = a.custid AND active = 1";

    cmd.ExecuteNonQuery();
    MessageBox.Show("Daily Accrued Updated");
}

在我的应用程序中,这个错误提示:

System.Data.SQLite.SQLiteException:'SQL逻辑错误, 靠近 "FROM":语法错误'


在数据库浏览器上显示版本号为 3.33.0。 - adrian38
1
这是 dB 浏览器使用的 SQLite 版本。您的应用程序可能使用不同版本。 - forpas
2
UPDATE语句中的FROM语法从版本3.33.0开始受支持:https://sqlite.org/lang_update.html#update_from。查询可以使用旧语法编写,但您必须说明列`balance`和`active`所属的表。 - forpas
我刚试着将它们改为a.balance和a.active,但仍然得到相同的错误。 - adrian38
这不是问题。在您的SQLite版本中,UPDATE语句的语法无效。我将发布一个使用旧语法的查询。 - forpas
显示剩余2条评论
1个回答

5
您的代码中的UPDATE...FROM语句的语法在SQLite 3.33.0之前的版本中不支持。
您可以使用相关子查询来使用旧的语法:
UPDATE account AS a
SET accrued = a.accrued +
    (SELECT p.intrate/365
    FROM customer c JOIN product p
    ON p.prodid = a.prodid
    WHERE c.custid = a.custid) * a.balance
WHERE a.active = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接