【问题标题】:SQLITE: How can I update the table using SELECT statement within an UPDATE statement?SQLITE:如何在 UPDATE 语句中使用 SELECT 语句更新表?
【发布时间】:2015-12-27 18:29:12
【问题描述】:

我有以下 payment_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 

我正在使用以下查询检查每个 ref_no 有多少个月没有支付:

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();
        }
    }

结果如下late_payments表:

ref_no   |unpaid_count
1        |3 
2        |4
3        |1
4        |2
5        |4
6        |5

现在,如果我在 Jan 中为 ref_no = 1 插入“PAID”,结果仍然相同。当然它会保持不变,因为我正在插入已经存在的记录而不是更新。

每当某个月份被检查为特定“ref_no”的“PAID”时,我都无法更新这些值。即:只要有变化就更新表。

更新:

我尝试了以下方法:

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();
        }

但是没有成功..

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

【问题讨论】:

  • 您的更新有效吗?你得到什么错误?你还尝试了什么?
  • 您的 select 语句返回两个值,但您只想更新一个 - 试试 SELECT count FROM A WHERE ref_no = 1
  • 试试UPDATE B SET count = (SELECT count FROM A WHERE ref_no = 1) AS C
  • “改变”是什么意思?
  • @CL。 .. 我的意思是只要 payment_2015 表发生变化,late_payment 应该反映新的变化并更新unpaid_count 列。

标签: c++ sql qt sqlite sql-update


【解决方案1】:

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

SELECT refno,
       (ifnull(Jan, '') != 'PAID') +
       (ifnull(Feb, '') != 'PAID') +
       ...
       (ifnull(Dec, '') != 'PAID) AS unpaid_count
FROM payments_2015;

然后您可以删除该表,而使用动态生成这些结果的视图:

CREATE VIEW late_payments_2015 AS
SELECT ...;

【讨论】:

  • 非常感谢..您的陈述比我的更容易编写和遵循...
【解决方案2】:

您的选择语句的更新语句是:

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

【讨论】:

  • 感谢您的回答。但是,我知道 UPDATE 语句的语法。这是在我正在努力解决的同一个查询中混合SELECTUPDATE..
  • &lt;your value&gt; 这里是 SELECT 声明,但您的解决方案不起作用
【解决方案3】:

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

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

这将更新b 中的所有行。您的问题并未提出任何将其限制为一行或几行的方法。

【讨论】:

  • 你说得对,我没有指定行数。请查看问题更新以获得更多解释。
  • 很抱歉您的回答无效,因为我有两个级别的 SELECT 语句。您回答中的 a 是另一个 SELECT 声明。
猜你喜欢
  • 2019-09-14
  • 1970-01-01
  • 2012-10-31
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多