我正在尝试将缺少的行插入表中。其中一列是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
答案 0 :(得分:2)
在带有标识列的数据库设计中处理这个问题要好得多 - 你没有提到你是否可以改变架构,但希望你可以在查询最终会更加清洁如果你不需要自己管理。
您可以在SQL Server管理工作室中为您的OrderNumber列设置Identity属性为on,但是它将生成的脚本使用新规范克隆表,插入您已经使用Identity_Insert获取的值,删除原始表,并重命名临时的替换它 - 这有很大的开销,取决于你有多少行。
最有效的方法可能是:
一旦完成,它就完成了 - 并照顾自己。难道你不想你的插入语句简单地说出这样的话:
INSERT INTO SPOL (sID, oID)
SELECT sID, oID,
FROM TMPO
WHERE OrderNumber IS NOT NULL
答案 1 :(得分:0)
使用identity(1,1)增加您的列订单号,这将使您的任务变得简单..!