4

我在表中有一行数据:

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。

4

1 回答 1

4

您可以使用 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 tableand INTO table,您将table同时复制每个外键的所有记录。

于 2012-10-23T04:06:04.317 回答