【问题标题】:Inserting a specified amount of rows into a table from another从另一个表中插入指定数量的行
【发布时间】:2016-06-08 23:28:29
【问题描述】:

如何将批次或指定数量的行从另一个表插入到另一个表中?

示例:将表 a 中的前 1000 行插入到表 b 中。 然后我想将接下来的 1000 行从表 a 插入到表中,以此类推。

一个典型的说法是:

insert into A
select top 1000 from table b

我现在如何从停止的位置将接下来的 1000 行选择到表 b 中? 从表 b 中选择前 1000 个

【问题讨论】:

  • 通常这样的事情会用光标来完成。您可能希望在 select 语句中使用 TOP 和 ORDER BY。互联网上确实有数千个这样的例子。
  • @SeanLange -- 通常这种事情不会用游标来完成,游标非常慢,在使用数据库系统时永远不应该使用它们。
  • @Hogan,我知道 TOP 一直是 SQL Server 的方式,但是现在不是也支持 ANSI SQL 的 FETCH FIRST 吗?
  • @Hogan SQL Server 自 SQL Server 2012 起也支持OFFSET X ROWS FETCH NEXT Y ROWS ONLY

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

希望你有一个pk

select 1  -- to get a @@rowcount > 0
while (@@rowcount > 0)  
begin
   insert into table2 (id, val)
   select top (1000)
          table1.id, table1.val 
     from table1 
     left join table2
          on table1.id = table2.id  
    where table2.id is null 
    order by table1.id -- keep index fragmentaion down 
end

我经常使用它,它非常有效
PK 连接是高效的

【讨论】:

    【解决方案2】:

    你可以这样做:

    WITH cte AS
        (
        SELECT
            *
            ROW_NUMBER() (ORDER BY [SomeDateOrIdField]) AS 'InsertId'
        FROM
            Table
        )
    INSERT INTO NewTable
    SELECT
        *
    FROM
        cte
    WHERE
        InsertId BETWEEN 1 AND 1000
    

    然后通过调整 WHERE 子句 BETWEEN 值重复查询接下来的 1000 条记录。

    【讨论】:

      【解决方案3】:

      这是 T-SQL 中的一个循环,可以执行您想要的操作。用你的表名和列名填空。

      Declare @checkCount INT
      Declare @loopCount INT
      
      
      Set @checkCount = 1 -- This will make the loop run at least once
      Set @loopCount = 0
      
      While @checkCount > 0 -- AND @loopCount < 5
      begin
      
      
          Insert into [Table2]
              (<Your column names here>)
              (Select Top 1000 <Your column names here> from Table1
                where <key> NOT IN (Select <key> from [Table2]))
      
          Select @checkCount = Count(*)
            from Table1
           where <key> NOT IN (Select <key> from [Table2])
      
          Set @loopCount = @loopCount + 1
      End
      

      【讨论】:

      • 查看我的@@rowcount 答案。它会更快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2018-12-05
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多