林小鱼 发表于 2024-8-6 07:33:02

【9.0.103】请教一个sql语句的问题 循环更新某个字段的问题



原来这个序号是无关紧要的,就允许为空了。现在要拿这个序号做为排序的字段,就不不能为空。
但数据库表中,原来的这些数据,是空的。
需要按照模板ID,空间ID为一个单位,按照detais_ID从小到大,把序号从1开始填。

这种sql语句怎么写,各位大佬~

管家婆软件 发表于 2024-8-6 07:33:03

本帖最后由 管家婆软件 于 2024-8-6 15:55 编辑


-- 创建临时表来存储序号为空的记录及其新的序号
CREATE TABLE #TempTable (
    模板ID INT,
    空间ID INT,
    DetailID INT,
    序号 INT,
    new_序号 INT
);

-- 向临时表中插入数据,生成新的序号
INSERT INTO #TempTable (模板ID, 空间ID, DetailID, 序号, new_序号)
SELECT
    模板ID,
    空间ID,
    DetailID,
    序号,
    ROW_NUMBER() OVER (PARTITION BY 模板ID, 空间ID ORDER BY DetailID) AS new_序号
FROM
    TableDetail
WHERE
    序号 IS NULL;

-- 使用临时表中的新序号更新原始表
UPDATE td
SET td.序号 = t.new_序号
FROM
    TableDetail td
JOIN
    #TempTable t ON td.模板ID = t.模板ID
      AND td.空间ID = t.空间ID
      AND td.DetailID = t.DetailID
      AND td.序号 IS NULL;

-- 删除临时表
DROP TABLE #TempTable;


这个脚本的步骤如下:

[*]创建一个临时表 #TempTable,用于存储 序号 为空的记录及其新的 序号。
[*]使用 INSERT INTO 语句将 序号 为空的记录插入到临时表中,并通过 ROW_NUMBER() 函数生成新的 序号,其中 ROW_NUMBER() 函数使用 PARTITION BY 模板ID, 空间ID 来分组,并根据 DetailID 进行排序。
[*]使用临时表中的新 序号 更新 TableDetail 表中的记录。
[*]删除临时表 #TempTable 以清理临时数据。
这种方法确保了每个 模板ID 和 空间ID 组合内的记录按照 DetailID 从小到大排序,并且序号从 1 开始递增。

毛毛 发表于 2024-8-6 08:04:44

本帖最后由 毛毛 于 2024-8-6 08:09 编辑

1、按detais_ID排序增加一个分组序号列,创建一个临时表,然后基于临时表更新这张表,用模板ID、空间ID、detais_ID作为关联字段

UPDATE
    待更新表
SET
    待更新表.待更新字段 = 源数据表.源数据字段
FROM
    待更新表 INNER JOIN 源数据表 ON 待更新表.关联字段 = 源数据表.关联字段

2、使用游标

如果表的记录数非常多的话建议使用第一种方法

Lay.Li 发表于 2024-8-6 10:15:45

大佬,和您确认一下,这里分组后是组内序号从1开始呢:nbtz5:

还是序号全部都从1开始排序呢

林小鱼 发表于 2024-8-6 10:44:33

Lay.Li 发表于 2024-8-6 10:15
大佬,和您确认一下,这里分组后是组内序号从1开始呢

还是序号全部都从1开始排序呢

分组后是组内序号从1开始

Lay.Li 发表于 2024-8-6 12:29:51

WITH temptable AS (
    SELECT
      [模板id],
      [空间id],
      [整数],
      ROW_NUMBER() OVER (PARTITION BY [模板id], [空间id] ORDER BY ASC) AS NewRowNum
    FROM
      [数据表1]
)
UPDATE yt
SET yt.序号= rd.NewRowNum
FROM
    [数据表1] yt
INNER JOIN temptable rd ON yt.[模板id] = rd.[模板id] AND yt.[空间id] = rd.[空间id] AND yt. = rd.

您好,sql我们也不是很擅长,在网上搜了一下,您可以试试上方的sql语句


林小鱼 发表于 2024-8-6 15:08:04

毛毛 发表于 2024-8-6 08:04
1、按detais_ID排序增加一个分组序号列,创建一个临时表,然后基于临时表更新这张表,用模板ID、空间ID、de ...

我卡在 这个分组序列号 怎么来?不还是回头最早了吗?:'(

Lay.Li 发表于 2024-8-6 16:56:26

感谢各位大佬的支持~
这里分组序列号,是用ROW_NUMBER()函数获取的,我这边儿使用上方的sql语句测试是可以的。您哪儿边使用上面的sql语句不可以么:'(


另外林总,有个事情问一下您。葡萄城为我们的伙伴专门打造了一个新系统,生态伙伴中心。
这个系统让我们可以随时查看订单、授权情况以及合作协议。此外,还可以了解企业成员的认证考试通过情况、培训情况,以及参与论坛的信息,手机和PC都可以访问!
为了保护一些可能涉及的敏感信息,系统将绑定一个超级管理员账号,就是论坛账号。想问下咱公司应该由哪个论坛账号来管理这些信息呢?

林小鱼 发表于 2024-8-6 17:09:25

Lay.Li 发表于 2024-8-6 16:56
感谢各位大佬的支持~
这里分组序列号,是用ROW_NUMBER()函数获取的,我这边儿使用上方的sql语句测试是可以 ...

就用这个账号~还有喊我小鱼 就好了~在你们面前 我是学生:lol

Lay.Li 发表于 2024-8-6 17:49:12

您谦虚了,以后有关实际业务场景上的一些问题,可能还需要您的帮助呢:lol
这边儿把伙伴系统的体验地址私发给您哈:i0tw2:
页: [1] 2
查看完整版本: 【9.0.103】请教一个sql语句的问题 循环更新某个字段的问题