我正在更新数据库表,其中将公司名称硬编码为列名称,以实现更灵活的设计。该表当前如下所示:
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语句中不包括联接吗?如何访问语句外的两个表?有其他更好的方法吗?