postgresql - 有条件地从单个表中插入多个表
问题描述
我有三个表如下:
Table_A:
id Desc Qty
1001 xx"23zp 4
1002 zpll"340 2
1003 sod"34LN 5
Table_B:
id Desc Qty
1001 xx"23zp 2
1002 zpll"340 5
1003 sod"34LN 7
Table_C:
id Desc Qty
1002 xx"23zp 2
1005 aqr"340 6
1008 sod"34LN 5
Table_C 是位于不同模式中的外部表。Table_A 和 Table_B 在相同的模式中。
Objective:
If Table_C.id = Table_A.id
then INSERT 记录 INTO Table_B。如果id
Table_B 中存在相同的内容,则更新相同的内容。如果Table_C.id <> Table_A.id
然后 INSERT 记录 INTO Table_A。
为了实现上述目的,我开发了一个id
作为输入参数的函数,在该函数中我使用了下面的代码片段。
CREATE temp TABLE new_records_indtls ON COMMIT DROP AS
SELECT c.id, c.Desc, c.Qty, a.id AS 'Tbl_A_id'
FROM Table_C c
LEFT OUTER JOIN Table_A
ON c.id = a.id
-- Inserting record into Table_B if the id is present in Table_A
INSERT INTO Table_B (id,"Desc","Qty")
SELECT id,Desc,Qty FROM new_records_indtls
WHERE "Tbl_A_id" NOTNULL
ON CONFLICT(id) DO UPDATE
"Desc" = EXCLUDED."Desc",
"Qty" = EXCLUDED."Qty";
-- Inserting records into Table_A if the id is not present in Table_A
INSERT INTO Table_A (id,'Desc','Qty')
SELECT id,"Desc","Qty" FROM new_records_indtls
WHERE "Tbl_A_id" IS NULL;
所以使用上面的代码,我们应该看到最终的 Table_A 和 Table_B 如下:
Table_A:
id Desc Qty
1001 xx"23zp 4
1002 zpll"340 2
1003 sod"34LN 5
1005 aqr"340 6
1008 sod"34LN 5
Table_B:
id Desc Qty
1001 xx"23zp 2
1002 zpll"340 2 <---Note that the Qty has been UPDATEd
1003 sod"34LN 7
但我无法在 Table_A 中看到与 1005 和 1008 有关的记录。但是,在 Table_B 中可以看到记录已正确更新。
我在这里缺少什么?我还尝试了另一种在这个 SO线程中使用数据修改 CTE 的方法,但没有运气。任何人都可以提供线索吗?
解决方案
推荐阅读
- r - ggplot2 - 在带有正负 y 值的条形图中以倒序排列的有序因子堆叠
- android - 成功将文件写入磁盘存储后如何打开文件
- sql - 根据日期和上一行获取行
- html - 我需要帮助如何在其他 div 中创建一个带有 div 的响应式框架
- c++ - 命名空间“asio”没有成员“io_context”
- docker - 如何从 docker 镜像运行 helm
- javascript - 在nodejs中将数字作为intiger插入mongodb
- windows - Delphi 和 Lazarus 中主菜单的不同视图
- reactjs - 意外的令牌,应为“;” 在渲染()
- android - 如何获取 Nativescript angular modal 的原生视图窗口的参考?