--以下语句为将process表iPacketVersionIden = 11改为iPacketVersionIden = 12,再追加入process表,但问题出在ProcessID中,ProcessID值不能重复,故有
(select (select max(ProcessID) from process))+1 as ProcessID 这句,想不断将最大值ProcessID+1写入,目前ProcessID最大值是1162,但执行此句后,都是1163(如下图),并不会递增,求帮忙看看,谢谢!
INSERT into process (
ProcessID,
ProcessName,
12
)
SELECT
(select (select max(ProcessID) from process))+1 as ProcessID,
ProcessName,
iPacketVersionIden
FROM process WHERE iPacketVersionIden = 11
根据您的描述,您想将process
表中iPacketVersionIden
为11的记录更新为12,并将更新后的记录追加到process
表中。您希望在插入新记录时,使用当前最大的ProcessID
值加1作为新的ProcessID
值。
问题出在您的查询中,您在子查询中使用了(select max(ProcessID) from process)
来获取当前最大的ProcessID
值,并在外部查询中使用(select (select max(ProcessID) from process))+1
来计算新的ProcessID
值。然而,由于子查询在每次执行时都会返回相同的结果,所以您得到的新的ProcessID
值始终是相同的。
要解决这个问题,您可以将获取最大ProcessID
值的子查询放在外部查询的FROM
子句中,使用CROSS JOIN
来将其与原始表进行连接,然后根据连接后的结果计算新的ProcessID
值。以下是修改后的查询:
INSERT INTO process (
ProcessID,
ProcessName,
iPacketVersionIden
)
SELECT
max_pid.ProcessID + 1 AS ProcessID,
p.ProcessName,
12 AS iPacketVersionIden
FROM
process p
CROSS JOIN
(SELECT max(ProcessID) AS ProcessID FROM process) max_pid
WHERE
p.iPacketVersionIden = 11;
在这个查询中,我们将获取最大ProcessID
值的子查询放在了外部查询的FROM
子句中,并使用CROSS JOIN
将其与原始表进行连接。然后,我们根据连接后的结果计算新的ProcessID
值,并将其插入到新记录中。
谢谢,但试过还是没变
插了重复键值,应该是processid 插入了相同的1163
键值约束
谢谢各位,正确答案:
INSERT into process (ProcessID,
MachineTypeID,
ProcessName,
Remark,
LogInfo,
IsLinked,
ModifyDate,
iPacketVersionIden,
ProcedureID)
SELECT
(row_number() over (order by ProcessID)+(select (select max(ProcessID) from process))) as ProcessID,
2,
ProcessName,
Remark,
LogInfo,
IsLinked,
ModifyDate,
12,
ProcedureID
FROM process WHERE iPacketVersionIden = 11