在SQL中触发,以更新相同的属性但在两个不同的行中

我正在尝试解决以下问题:

我有两个表,第一个称为“付款”,看起来像这样:

./assets/img/abc.jpg

第二个表称为“月”,如下所示:

id_payment |  date      | id_month |  total 
-----------+------------+----------+--------
1          | 2019-01-01 |    1     |     0 
2          | 2019-01-02 |    2     |   160

现在的问题是,如果我更新其中一项付款的日期,则触发器应使表格如下所示:

id_month | month_name    | initial_date | final_date | total_payments 
---------+---------------+--------------+------------+---------------
    1    | January/2019  | 2019-01-01   | 2019-31-01 |      0
    2    | February/2019 | 2019-01-02   | 2019-28-02 |    160

但是最终结果是这样的:

id_payment | date       | id_month |  total 
-----------+------------+----------+--------
    1      | 2019-01-01 |    1     |    0 
    2      | 2019-01-01 |    1     |  160


id_month | month_name    | initial_date | final_date | total_payments 
---------+---------------+--------------+------------+---------------
   1     | January/2019  | 2019-01-01   | 2019-31-01 |   160
   2     | February/2019 | 2019-01-02   | 2019-28-02 |     0

我的触发器

id_payment |  date      | id_month |  total 
-----------+------------+----------+-------
    1      | 2019-01-01 |   1      |    0 
    2      | 2019-01-01 |   1      |  160


id_month | month_name    | initial_date | final_date | total_payments 
---------+---------------+--------------+------------+---------------
    1    | January/2019  | 2019-01-01   | 2019-31-01 |    160
    2    | February/2019 | 2019-01-02   | 2019-28-02 |    160
inuyasha7 回答:在SQL中触发,以更新相同的属性但在两个不同的行中

您的查询中有很多与表不匹配的东西,例如id_mes,以及付款查询中的o vs p别名,但是真正的问题是触发器仅假设一行。

情况并非如此,触发器将在整个更新过程中被调用一次,并且将插入多行。

这是一个有效的更新程序,具体取决于数据库。如果您的数据库不支持CTE,则应该能够对其进行修改

;with totals as (
    select id_month,sum(total) as total_payments 
    from payments
    where id_month in (select id_month FROM inserted)
    group by id_month
)
update month set total_payments=t.total_payments
from month 
join totals on totals.id_month=month.id_month
本文链接:https://www.f2er.com/3147848.html

大家都在问