【问题标题】:mysql: duplicate certain rows using SQL?mysql:使用 SQL 复制某些行?
【发布时间】:2009-09-07 17:18:30
【问题描述】:

我有一张如下所示的表格:

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

我想运行一些 SQL,它将获取这些行中的每一行并基于它创建另一个,如下所示:

foreach row where vid=2,创建一个重复的行 where 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 行),而且这是一次性的(因此代码不需要进行惊人的优化或其他任何事情)。谢谢!

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    你可能会想要这个:

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

    它插入所有行,vid 递增 1

    【讨论】:

      【解决方案2】:

      如果您想要一个通用解决方案(即 vid 的所有值,但为每个值添加一个),这只是适应 dandres 的答案:

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

      编辑:固定在 select 语句中进行算术运算。

      【讨论】:

      • 我不认为 SQL 将允许您在列列表中使用算术...但是很好的方法。您需要在 SELECT 语句本身中进行匹配。
      • @dandres:是的,您可以在 SELECT 子句中进行算术甚至数据类型转换。
      • @rexem,dandres 的评论指的是在编辑之前,添加内容在 INTO 列列表中。
      【解决方案3】:

      你能做到以下几点:

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

      两列似乎具有相同的名称,但以上应该可以工作。它需要一组 Vid = 2 元素,再次插入它们,但使用 Vid = 3。

      【讨论】:

      • 哎呀,你是对的——最后一列应该是 tid。感谢您的帮助!
      【解决方案4】:
      1. 创建另一个具有 2 个固定记录的表,例如TwoRec (vvid),值为 2 和 3
      2. 使用 TwoRec 进行笛卡尔连接,即

        选择 TheTable.nid、TwoRec.vvid、TheTable.nid 来自 TheTable,TwoRec WHERE TheTable.vid = 2;

      【讨论】:

        【解决方案5】:

        我会为您要使用的所有 vids 创建一个临时表:

        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
        

        【讨论】:

          猜你喜欢
          • 2013-08-19
          • 1970-01-01
          • 1970-01-01
          • 2016-01-27
          • 1970-01-01
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多