我试图将缺少的行插入表中.其中一列是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