【问题标题】:Single SQLstatement for many INSERTs许多 INSERT 的单个 SQL 语句
【发布时间】:2015-08-03 23:15:24
【问题描述】:

请参阅下面的 DDL:

CREATE TABLE #Test (ID INT NOT NULL IDENTITY, Name varchar(100), [Key] int, primary key (ID))
INSERT INTO #Test (Name, [Key]) values ('Ian',1)
INSERT INTO #Test (Name, [Key]) values ('Iain',1)
INSERT INTO #Test (Name, [Key]) values ('Eon',1)
INSERT INTO #Test (Name, [Key]) values ('Mark',2)
INSERT INTO #Test (Name, [Key]) values ('Steven',2)

以及下面的 DDL:

CREATE TABLE #Test2 (ID INT NOT NULL IDENTITY, Name varchar(100), primary key (ID))
INSERT INTO #Test2 (Name) values ('Graham')
INSERT INTO #Test2 (Name) values ('William')
INSERT INTO #Test2 (Name) values ('Neil')
INSERT INTO #Test2 (Name) values ('Calum')
INSERT INTO #Test2 (Name) values ('Wayne')

我想将#Test2 中的所有内容插入#Test。我希望#Test2 中的每条记录在#Test 中都有一个唯一的键。实际上,我希望这种情况发生:

INSERT INTO #Test (Name, [Key]) VALUES ('Graham', 3)
INSERT INTO #Test (Name, [Key]) VALUES ('William', 4)
INSERT INTO #Test (Name, [Key]) VALUES ('Calum', 5)
INSERT INTO #Test (Name, [Key]) VALUES ('Wayne', 6)

#Test 和#Test2 中有数百万条记录。

是否可以使用单个 SQL 语句完成所有 INSERTS,还是必须使用游标。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您只需要高于最大值的新数字。存在的关键?这应该有效:

    declare @maxkey int
    select @maxkey = max([Key]) from Test
    
    insert into Test (Name, [Key]) 
    select Name, row_number () over (order by (select null)) + @maxkey
    from Test2
    

    这只是获取最大值。键并使用 row_number 将数字添加到来自 Test2 的行。

    SQL Fiddle

    【讨论】:

    • 谢谢,这正是我想要的。 +1。
    【解决方案2】:

    你可以试试这样的逻辑:

    insert into #Test
    select Name, ((select max([Key]) from #Test) + ID) as [Key]
    from #Test2
    order by ID asc;
    

    这是我的小提琴示例:Fiddle

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多