mysql:使用SQL复制某些行?

时间:2009-09-07 17:18:30

标签: sql mysql

我有一个看起来像这样的表:

nid  vid  tid
1   2    3
2   2    4
3   2    4
4   2    3

我想运行一些SQL,它会占用这些行中的每一行并基于它创建另一行,如下所示:

foreach row其中vid = 2,创建一个重复的行,其中vid = 3

所以我最终会这样:

   nid  vid  tid
    1   2    3
    2   2    4
    3   2    4
    4   2    3
    1   3    3
    2   3    4
    3   3    4
    4   3    3

表不是那么大(我认为少于500行),这是一次性的事情(因此代码不需要进行惊人的优化或任何事情)。谢谢!

5 个答案:

答案 0 :(得分:2)

如果你想要一个通用的解决方案(即vid的所有值,但每个都加一个),这只是调整dandres的答案:

INSERT INTO TheTable(nid, vid_incremented,  nid)
SELECT nid, vid + 1 as vid_incremented , nid
FROM TheTable

编辑:修复以在select语句中执行算术。

答案 1 :(得分:2)

你可能想要这个:

INSERT INTO `table`(`nid`, `vid`,  `nid`)
SELECT `nid`, `vid`+1, `nid`
  FROM `table`
 WHERE `vid` = 2

它会插入所有行,vid递增1

答案 2 :(得分:1)

你能做到以下几点:

INSERT INTO TheTable(nid, vid,  nid)
SELECT nid, 3, nid
FROM TheTable
WHERE vid = 2

两列似乎具有相同的名称,但上述内容应该有效。它采用一组Vid = 2元素,再次插入它们但使用Vid = 3.

答案 3 :(得分:1)

  1. 创建另一个包含2个固定记录的表格,例如TwoRec(vvid),值为2和3
  2. 与TwoRec进行笛卡尔联合,即

    SELECT TheTable.nid,TwoRec.vvid,TheTable.nid 来自TheTable,TwoRec WHERE TheTable.vid = 2;

答案 4 :(得分:1)

我会创建一个包含您要使用的所有vid的临时表:

create temporary table Vids
(
   vid int
)

declare @vid int
declare @maxvid int

set @vid = 1
set @maxvid = 500

while @vid < @maxvid
begin
    insert into vids values(@vid)
    set @vid = @vid + 1
end

然后,我会使用那个临时表来构建你的另一个表:

select
    t2.id,
    t1.vid,
    t2.nid
into newtable
from
    vids t1
    cross join tbl t2
order by
    t1.vid,
    t2.id