如何从Postgres中相同的两个联接表插入两个表

时间:2019-05-03 20:41:09

标签: postgresql

我正在更新数据库表,其中将公司名称硬编码为列名称,以实现更灵活的设计。该表当前如下所示:

table: transactions (current)
| id | contract_id | company_a_tot | company_b_tot | company_c_tot |
| -- | ----------- | ------------- | ------------- | ------------- |
| 1  |       10    |    200        |    300        |    400        |

我想实现这种设计:

table: transactions (new)
| id | contract_id | company | total |
| -- | ----------- | ------- | ----- |
| 1  |    10       |    a    |   200 |
| 2  |    101      |    b    |   300 |
| 3  |    102      |    c    |   400 |

第二个表名为与交易相关的合同。 对于在交易表上创建的每个新行,我需要在合同表上创建相应的行。

table: contracts
| id  | data |
| --- | ---- |
| 10  |   x  |
| 101 |   x  |
| 102 |   x  |

在交易表上,我需要为除一个公司列以外的所有列插入新行。 在上面的示例中,id为1的交易行扩展为三个交易行。 我可以成功地将事务从旧表扩展到新表,但是对于在事务表上创建的每个新行,我需要在合同表上创建对应的行。 我尝试使用没有运气的数据修改语句。

WITH ins AS (
    INSERT INTO contracts(data)
    SELECT contracts.data
    FROM contracts
    RIGHT JOIN transactions
    ON contracts.id=transactions.contract_id
    RETURNING contracts.id as c_id, transactions.id as t_id, transactions.data AS t_data
)
UPDATE transactions
    SET contract_id=ins.c_id, data=ins.t_data
    FROM ins
    WHERE id=ins.t_id;

我收到以下错误:

'missing FROM-clause entry for table "transactions"' 
on line 'returning contracts.id as c_id, transactions.id as t_id, transactions.data as t_data'

我是这种类型和复杂性查询的新手。我可以在数据修改with语句中不包括联接吗?如何访问语句外的两个表?有其他更好的方法吗?

0 个答案:

没有答案