SQL:多次复制一行,每次更改一个值

时间:2012-10-23 04:03:26

标签: sql insert-select

我在表格中有一行数据:

Key | Val1 | Val2
----+------+-----
1   | A    | B

我想复制这一行,但是从列表中为每个新行分配一个不同的键(实际上是一个外键):

New keys
--------
2
3
4

可以通过查询轻松获取此列表。复制后,表格应如下所示:

Key | Val1 | Val2
----+------+-----
1   | A    | B
2   | A    | B
3   | A    | B
4   | A    | B

到目前为止,我想出的就是:

INSERT INTO table (Key, Val1, Val2) (
    SELECT '2' AS Key, Val1, Val2 FROM table WHERE Key='1'
);

这有效,但当然它一次只能复制一行。有没有办法一次复制所有行?

如果它有所作为,我正在使用Oracle。

1 个答案:

答案 0 :(得分:3)

您可以使用SELECT .. FROM DUAL来组成值,并且可以使用UNION ALL将多行组合成单个结果。还有其他各种方法可以创建结果集,例如递归公用表表达式。

INSERT INTO table (Key, Val1, Val2)
SELECT d.newKey, t.Val1, t.Val2
FROM table t
cross join (select 2 NewKey from dual union all
            select 3 NewKey from dual union all
            select 4 NewKey from dual) d;

如果您的新密钥来自子查询,则更容易,例如。

INSERT INTO table (Key, Val1, Val2)
SELECT d.FKey, t.Val1, t.Val2
FROM table t
cross join (select FKey
            from SomeOtherTable
            Where ......) d;

但是,请注意,因为您正在复制FROM tableINTO table,所以您将同时为每个外键复制table的所有记录