我正在尝试将丢失的行插入表中。其中一列是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

最佳答案

在数据库设计中使用标识列处理这个问题要好得多 - 您没有提到您是否可以更改架构,但希望您可以,因为如果您不必自己管理它,查询最终会更清晰.

您可以在 SQL Server management studio 中将 OrderNumber 列的 Identity 属性设置为 on,但它会生成的脚本使用新规范克隆表,插入您已经使用 Identity_Insert 获得的值,删除原始表,然后重命名临时的以替换它 - 这会产生大量开销,具体取决于您拥有的行数。

最有效的方法可能是:

  • 使用
  • 上的 identity 属性创建一个附加列
  • 复制值
  • 重命名原始列
  • 将新列重命名为与原始
  • 相同的名称
  • 删除原来的 OrderNumber 列

  • 一旦完成,它就完成了 - 并照顾好自己。难道你宁愿你的插入语句只是说这样的话:
    INSERT INTO SPOL (sID, oID)
    SELECT sID, oID,
    FROM   TMPO
    WHERE  OrderNumber IS NOT NULL
    

    关于sql - INSERT INTO 使用 SELECT 并增加列中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9409679/

    10-09 12:56