C++ SQLITE:如何在update语句中使用SELECT语句更新表?

C++ SQLITE:如何在update语句中使用SELECT语句更新表?,c++,sql,qt,sqlite,sql-update,C++,Sql,Qt,Sqlite,Sql Update,我有以下2015年付款表: ref-no |Jan |Feb |Mar |Apr |May |Jun 1 | |PAID |PAID | |PAID | 2 | |PAID | | | |PAID 3 |PAID | |PAID |PAID |PAID |PAID 4 |PAID |PAID

我有以下2015年付款表:

ref-no  |Jan    |Feb    |Mar   |Apr    |May     |Jun
1       |       |PAID   |PAID  |       |PAID    |  
2       |       |PAID   |      |       |        |PAID
3       |PAID   |       |PAID  |PAID   |PAID    |PAID
4       |PAID   |PAID   |      |PAID   |PAID    |
5       |PAID   |       |PAID  |       |        |
6       |       |       |      |       |        |PAID 
我正在使用以下查询检查每个参考号有多少个月未支付:

for(int i = 0; i < all_refNo_list.size(); i++) {
        qryTxt = "INSERT INTO late_payments "
                "select ref_no AS ref_no, sum(i_count) as unpaid_count from ("
                "SELECT ref_no, CASE WHEN January = 'PAID' THEN 0 ELSE 1 END AS i_count, 1 AS month_no FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN February = 'PAID' THEN 0 ELSE 1 END , 2  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN March = 'PAID' THEN 0 ELSE 1 END , 3  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN April = 'PAID' THEN 0 ELSE 1 END , 4  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN May = 'PAID' THEN 0 ELSE 1 END , 5  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN June = 'PAID' THEN 0 ELSE 1 END , 6  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN July = 'PAID' THEN 0 ELSE 1 END , 7  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN August = 'PAID' THEN 0 ELSE 1 END , 8  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN September = 'PAID' THEN 0 ELSE 1 END , 9  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN October = 'PAID' THEN 0 ELSE 1 END , 10  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN November = 'PAID' THEN 0 ELSE 1 END , 11  FROM payments_" + getCurrentYear() +
                " UNION SELECT ref_no, CASE WHEN December = 'PAID' THEN 0 ELSE 1 END , 12  FROM payments_" + getCurrentYear() +
                ") A Where ref_no = " + all_refNo_list[i];

        query.prepare(qryTxt);
        if (!query.exec())
        {
            qDebug() << "Error" << query.lastError().text();
        }
    }
现在,如果我在1月份为ref_no=1插入“PAID”,结果仍然相同。当然,它将保持不变,因为我插入的是已经存在的记录,而不是更新

每当某个月被检查为“已支付”特定“参考号”时,我无法更新这些值。i、 e:只要有变化,就更新表格

更新:

我尝试了以下方法:

for(int i = 0; i < getAllRefNoList().size(); i++) { 
qryTxt = "UPDATE late_payments "
                "SET unpaid_count = ("
                "select sum(i_count) as unpaid_count from ("
                "SELECT CASE WHEN January = 'PAID' THEN 0 ELSE 1 END AS i_count, 1 AS month_no FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN February = 'PAID' THEN 0 ELSE 1 END , 2  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN March = 'PAID' THEN 0 ELSE 1 END , 3  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN April = 'PAID' THEN 0 ELSE 1 END , 4  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN May = 'PAID' THEN 0 ELSE 1 END , 5  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN June = 'PAID' THEN 0 ELSE 1 END , 6  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN July = 'PAID' THEN 0 ELSE 1 END , 7  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN August = 'PAID' THEN 0 ELSE 1 END , 8  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN September = 'PAID' THEN 0 ELSE 1 END , 9  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN October = 'PAID' THEN 0 ELSE 1 END , 10  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN November = 'PAID' THEN 0 ELSE 1 END , 11  FROM payments_" + getCurrentYear() +
                " UNION SELECT CASE WHEN December = 'PAID' THEN 0 ELSE 1 END , 12  FROM payments_" + getCurrentYear() +
                ") A WHERE ref_no = " + getAllRefNoList()[i] + ")";

        query.prepare(qryTxt);
        if (!query.exec())
        {
            qDebug() << "Error" << query.lastError().text();
        }
但是没有成功


S.S:我在Qt上为C++应用程序实现这些选择语句。我正在使用QSqlQueryModel在QTableView上显示select语句的结果。

select语句的更新语句是:

UPDATE A
    SET COUNT = <your value>
WHERE ref_no = 1

select语句的Update语句为:

UPDATE A
    SET COUNT = <your value>
WHERE ref_no = 1

看起来你们这里有两张桌子。一种方法是:

update b
    set count = (select count from a where ref_no = 1);

这将更新b中的所有行。您的问题没有建议将其限制为一行或几行。

这里似乎有两个表。一种方法是:

update b
    set count = (select count from a where ref_no = 1);

这将更新b中的所有行。您的问题不建议将其限制为一行或几行。

首先,创建一个查询以计算所需的表:

SELECT refno,
       (ifnull(Jan, '') != 'PAID') +
       (ifnull(Feb, '') != 'PAID') +
       ...
       (ifnull(Dec, '') != 'PAID) AS unpaid_count
FROM payments_2015;
然后,您可以删除该表,而是使用动态生成这些结果的视图:

CREATE VIEW late_payments_2015 AS
SELECT ...;

首先,创建一个查询来计算所需的表:

SELECT refno,
       (ifnull(Jan, '') != 'PAID') +
       (ifnull(Feb, '') != 'PAID') +
       ...
       (ifnull(Dec, '') != 'PAID) AS unpaid_count
FROM payments_2015;
然后,您可以删除该表,而是使用动态生成这些结果的视图:

CREATE VIEW late_payments_2015 AS
SELECT ...;

你的更新有效吗?你有什么错误?您还尝试了什么?您的select语句返回两个值,但您只想更新一个-尝试从WHERE ref_no=1中选择计数。尝试使用update B SET count=select count从WHERE ref_no=1中选择计数作为cW更改是什么意思?@CL。。我的意思是,每当2015年付款表发生变化时,逾期付款应反映新的变化,并更新“未付金额”列。您的更新有效吗?你有什么错误?您还尝试了什么?您的select语句返回两个值,但您只想更新一个-尝试从WHERE ref_no=1中选择计数。尝试使用update B SET count=select count从WHERE ref_no=1中选择计数作为cW更改是什么意思?@CL。。我的意思是,每当2015年付款表发生变化时,逾期付款应反映新的变化,并更新“未付金额”列。谢谢您的回答。但是,我知道UPDATE语句语法。这是在同一个查询中混合使用SELECT和UPDATE的问题,这是一个SELECT语句,但是您的解决方案不起作用。谢谢您的回答。但是,我知道UPDATE语句语法。这是在同一个查询中混合使用SELECT和UPDATE,这是我正在努力解决的问题。。下面是SELECT语句,但您的解决方案不起作用。您是对的,我没有指定行数。请查看问题更新以了解更多解释。很抱歉,您的回答不起作用,因为我有两个级别的SELECT语句。答案中的a是另一个SELECT语句。您是对的,我没有指定行数。请查看问题更新以了解更多解释。很抱歉,您的回答不起作用,因为我有两个级别的SELECT语句。你的答案中的a是另一个精选语句。非常感谢。。你的陈述比我的更容易写和理解…非常感谢。。你的陈述比我的更容易写和理解。。。