将数据从 link table 迁移到目标 table

Migrate data from a link table into target table

我有两个 table。一个(我们称它为 a)目前是一个 link table,数据如下

| c_id  | t_id  |
|-------|-------|
|   1   |   8   |
|   1   |   9   |
|   2   |   8   |
|   3   |   8   |
|   4   |   9   |

和另一个 (t) 具有这样的数据

|  id   | code  | value |
|-------|-------|-------|
|   1   |  AB   |  0.9  |
|   2   |  BC   |  0    |
|   3   |  IM   |  0    |
|   4   |  MC   |  0    |
|   5   |  VI   |  0    |
|   6   |  BC   |  0.9  |
|   7   |  MC   |  2.5  |
|   8   |  VI   |  2.5  |
|   9   |  BC   |  2.5  |

t_id in table a 是映射到 table id t 的外键,这是一个自动递增的 ID .

由于功能更改,我现在希望 a 中的数据复制 t 中的 linked 行并添加所需的 c_id(然后 table a 被删除)所以你得到这样的东西;

|  id   | c_id  | code  | value |
|-------|-------|-------|-------|
...
|  25   |   1   |  VI   |  2.5  |
|  26   |   2   |  VI   |  2.5  |
|  27   |   3   |  VI   |  2.5  |
|  28   |   1   |  BC   |  2.5  |
|  29   |   4   |  BC   |  2.5  |

这将使我能够更改每个 c_idvalue 列,而不是全局更改。新行可以安全地添加到 table 的末尾 - 或者在 table 中包含此信息可能会更好。

是否有可以执行此操作的查询?我希望我不必手工做!

假设我理解正确,因为你提到修改 tables,这是一个 one-time 过程。

您将无法将行添加到任何现有 table 的末尾,因为您有不同的列要求。您必须创建一个新的 table 或修改现有的。我选择了前者,然后您可以使用 CREATE TABLE ... SELECT ... 语法填充它:

CREATE TABLE new_t (id SERIAL, c_id INT, code VARCHAR(2), value FLOAT);

INSERT INTO new_t (c_id, code, value)
    SELECT a.c_id, t.code, t.value FROM a INNER JOIN t ON (t.id = a.t_id);

http://sqlfiddle.com/#!9/c6765/2