首页 > 解决方案 > 有条件地从单个表中插入多个表

问题描述

我有三个表如下:

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.idthen INSERT 记录 INTO Table_B。如果idTable_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 的方法,但没有运气。任何人都可以提供线索吗?

标签: postgresql

解决方案


推荐阅读