我有一个看起来像这样的表:
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行),这是一次性的事情(因此代码不需要进行惊人的优化或任何事情)。谢谢!
答案 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)
与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