sql – 使用SELECT并在列中增加值来INSERT INTO

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

由于OrderNumber导致主键问题是sID OrderNumber,因此下面的语句不起作用.

如何根据sID列为每个插入的行增加OrderNumber?

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管理工作室中为您的OrderNumber列设置Identity属性为on,但是它将生成的脚本使用新规范克隆表,插入已经使用Identity_Insert获取的值,删除原始表,以及重命名临时的替换它 – 这会产生巨大的开销,具体取决于你有多少行.

最有效的方法可能是:

>创建一个带有identity属性的附加列
>复制价值观
>重命名原始列
>将新列重命名为与原始列相同的名称
>删除原始的OrderNumber列

一旦完成,它就完成了 – 并且照顾好自己.难道你不想你的插入语句简单地说出这样的话:

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