You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server:基于CODE与ID_IMG列自动递增ORDER列的实现求助

解决批量插入时按CODE分组生成递增ORDRE值的问题

你遇到的问题我太懂了:当@idart里同一个CODE有多条记录时,原语句里的MAX(ORDRE)只会取插入前的最大值,结果所有同CODE的新记录ORDRE都一样,根本没法实现递增的效果。别着急,用窗口函数就能完美解决这个问题。

修正后的INSERT语句

INSERT INTO [NOMENC_ARTICLES_IMAGES] (CODE, ID_IMG, ORDRE)
SELECT 
    I.CODE,
    I.ID AS ID_IMG,
    -- 先拿目标表中该CODE已有的最大ORDRE(没有就用0),再加上组内的递增序号
    COALESCE(CurrentMax.MaxOrdre, 0) + ROW_NUMBER() OVER (PARTITION BY I.CODE ORDER BY I.ID) AS ORDRE
FROM @idart AS I
-- 提前算出每个CODE当前的最大ORDRE,避免重复计算
LEFT JOIN (
    SELECT CODE, MAX(ORDRE) AS MaxOrdre
    FROM [NOMENC_ARTICLES_IMAGES]
    GROUP BY CODE
) AS CurrentMax ON CurrentMax.CODE = I.CODE;

关键细节说明:

  • ROW_NUMBER() OVER (PARTITION BY I.CODE ORDER BY I.ID):这是核心!它会把@idart里的记录按CODE分组,每组内按ID排序(你可以换成你需要的排序字段,比如插入时间),生成从1开始的序号。这样同一个CODE的多条记录就能得到1、2、3...的序号了。
  • COALESCE(CurrentMax.MaxOrdre, 0):如果目标表中某个CODE还没有任何记录,MAX(ORDRE)会返回NULL,用COALESCE把它换成0,这样新记录的ORDRE就从1开始(0+1);如果已经有记录,就用现有最大值加上组内序号,保证和已有记录的序号无缝衔接。
  • 这个语句是一次性处理所有@idart的记录,不管同一个CODE有多少条,都能生成连续不重复的ORDRE值,完全符合你的需求。

举个例子验证:

假设目标表已经有这些数据:

CODEID_IMGORDRE
A00110011
A00110022

@idart里的待插入数据:

CODEID
A0011003
A0011004
B0012001

执行完语句后,插入的记录会是:

CODEID_IMGORDRE
A00110033
A00110044
B00120011

完美实现了你要的按CODE分组分配递增ORDRE的效果!

内容的提问来源于stack exchange,提问作者Sweet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:37:55