我正在尝试将丢失的行插入表中。其中一列是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 获得的值,删除原始表,然后重命名临时的以替换它 - 这会产生大量开销,具体取决于您拥有的行数。
最有效的方法可能是:
一旦完成,它就完成了 - 并照顾好自己。难道你宁愿你的插入语句只是说这样的话:
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/