INSERT INTO使用SELECT中的SELECT和增量值

时间:2012-02-23 08:48:57

标签: sql sql-server sql-server-2005 insert increment

我正在尝试将缺少的行插入表中。其中一列是OrderNumber(排序编号),此列应为表中OrderNumber返回的sID最大值的+1。有些sIDs没有出现在SPOL表中,这就是语句末尾有WHERE子句的原因。我会再次运行此语句,但将OrderNumber设置为1表示表中当前不存在sID的记录。

由于OrderNumber导致主键sID + OrderNumber出现问题,以下声明无法使用。

如何根据OrderNumber列插入的每一行增加sID

INSERT INTO SPOL(sID, OrderNumber, oID)
   SELECT           
      sID, OrderNumber, oID
   FROM
      (SELECT 
           sID, 
           (SELECT Max(OrderNumber) + 1
            FROM SPOL
            WHERE sID = TMPO.sID) AS OrderNumber, 
           oID
       FROM TMPO
       WHERE NOT EXISTS (SELECT * FROM SPOL
                         WHERE SPOL.oID = TMPO.oID)
      ) AS MyData
   WHERE
       OrderNumber IS NOT NULL  

2 个答案:

答案 0 :(得分:2)

在带有标识列的数据库设计中处理这个问题要好得多 - 你没有提到你是否可以改变架构,但希望你可以在查询最终会更加清洁如果你不需要自己管理。

您可以在SQL Server管理工作室中为您的OrderNumber列设置Identity属性为on,但是它将生成的脚本使用新规范克隆表,插入您已经使用Identity_Insert获取的值,删除原始表,并重命名临时的替换它 - 这有很大的开销,取决于你有多少行。

最有效的方法可能是:

  1. 使用
  2. 上的标识属性创建其他列
  3. 复制值
  4. 重命名原始列
  5. 将新列重命名为与原始列相同的名称
  6. 删除原始的OrderNumber列
  7. 一旦完成,它就完成了 - 并照顾自己。难道你不想你的插入语句简单地说出这样的话:

    INSERT INTO SPOL (sID, oID)
    SELECT sID, oID,
    FROM   TMPO
    WHERE  OrderNumber IS NOT NULL
    

答案 1 :(得分:0)

使用identity(1,1)增加您的列订单号,这将使您的任务变得简单..!