【问题标题】:SQL Auto Increment a value with multiple insertsSQL自动增加具有多个插入的值
【发布时间】:2014-05-12 21:46:03
【问题描述】:

我们正在针对 SQL Server 2008 数据库执行 SQL 查询。

INSERT INTO ListDetail(ListID, Sequence, CompName, CompAddress, Date)
(
 SELECT
   12345 AS 'ListID',
   (MAX(ListDetail.Sequence) + 1) AUTO_INCREMENT as 'Sequence',
   Company.Name AS 'CompName',
   Company.Address AS 'CompAddress',
   GETDATE() AS 'Date'
 FROM Company
 WHERE CompanyType = 3
)

我们想从 ListDetail 表中找到最大序列.. 并从 Company 表中选择记录到 ListDetail 中。但是,我们希望从 ListDetail 中的下一个可用序列值开始,然后为插入的每条记录递增 1。 ListDetail 中的 Sequence 字段只是一个通用的 INT 字段。

我们无法控制数据库本身...因此不能创建新表或更改现有表。

【问题讨论】:

    标签: sql insert sequence auto-increment insert-into


    【解决方案1】:

    这样的简单方法应该适合您。

    INSERT INTO ListDetail(ListID, Sequence, CompName, CompAddress, Date)
    (
     SELECT
     12345,
     (SELECT MAX(Sequence) + 1 FROM ListDetail),
     Company.Name,
     Company.Address,
     GETDATE()
     FROM Company
     WHERE CompanyType = 3
    )
    

    【讨论】:

    • 我认为这不会产生正确的结果(尽管我可以看到它应该如何有意义)。看看这个小提琴:sqlfiddle.com/#!3/d8ed9/1
    • 同意,这似乎是有道理的,但我实际上曾尝试过一次,但没有成功。
    【解决方案2】:

    一种选择是将Row_Number() 与返回max() 的子查询一起使用:

    简化解决方案:

    insert into ListDetail 
    select 12345, sq+row_number() over (order by (select null))
    from company, (select max(sequence) sq from listdetail) t
    

    INSERT INTO ListDetail(ListID, Sequence, CompName, CompAddress, Date)
    SELECT
       12345,
       sq+row_number() over (order by (select null)),
       Name,
       Address,
       GETDATE()
    FROM Company, (select max(sequence) sq from listdetail) t
    WHERE CompanyType = 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-17
      • 2013-04-12
      • 2018-12-14
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多