SQL多表更新

发布于 2021-10-22  265 次阅读


上班的时候静不下心来,回到家想了一下,梳理了一下思路,差不多是这样,应该没啥问题

SQL表结构

三张表

金额明细表

单据明细表

单据表

SQL语句

/*
对外结算单、明细、金额新增
*/

UPDATE detail_t AS A,amount_t AS B 
SET A.del_flage = "N" ,B.del_flage ="N"
WHERE A.detail_id = B.detail_id
AND A.detail_id = 2;

/*
更新流程

1.获取当前数据库中涉及到的数据--->通过结算单号获得 第1次sql
2.对比前端传入的明细数据
2.1构造追加删除数据信息(向前端传入的数据中追加由明细ID和删除标志组成的数据 其他数据也要传入,防止误删)
2.1.1 使用 REPLACE INTO 进行更细插入
2.2将前端传入的缺少明细ID的数据认为是需要新增数据,单独抽取(在最后进行插入操作),并在List中移除
3.更新明细数据 第2次sql
4.通过2.2抽取的明细数据走新增操作 第3次sql
*/
UPDATE  detail_t AS A,amount_t AS B
SET
 /*foreach  1st START*/

A.del_flage = CASE A.detail_id
    WHEN 1 THEN "N"
    WHEN 2 THEN "Y"
     END,
A.apply_id = CASE A.detail_id
 WHEN 1 THEN 20211023
 /*此处需要包含已经删除的数据内容,要不会清掉其他的*/
 WHEN 2 THEN 20211022
 END,
 /*foreach  2nd START*/
 /*若ID数据外为空的话就不加载语句 mybatis if语句控制*/
B.amount = CASE
    WHEN B.detail_id=1 AND B.amount_type="other" THEN 333
    WHEN B.detail_id=1 AND B.amount_type="food" THEN 888
    /*此处需要包含已经删除的数据内容,要不会清掉其他的数据金额*/
END,
B.del_flage = CASE B.detail_id
 WHEN 2 THEN "Y"
 WHEN 1 THEN "N"
END
 /*foreach  2nd END*/
 /*foreach 1st END*/

/*这地方忘了怎么想的了,先这样吧,貌似不影响*/
WHERE A.detail_id = B.detail_id
AND B.detail_id IN (1,2)

我们都要做生活的高手。