找回密码
 立即注册

QQ登录

只需一步,快速开始

林小鱼
金牌服务用户   /  发表于:2024-8-6 07:33  /   查看:1010  /  回复:11
50金币


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

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

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

-- 创建临时表来存储序号为空的记录及其新的序号 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 Deta ...

11 个回复

倒序浏览
最佳答案
最佳答案
管家婆软件
注册会员   /  发表于:2024-8-6 07:33:03
来自 7#
本帖最后由 管家婆软件 于 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 开始递增。

评分

参与人数 1满意度 +5 收起 理由
林小鱼 + 5

查看全部评分

回复 使用道具 举报
毛毛
金牌服务用户   /  发表于:2024-8-6 08:04:44
2#
本帖最后由 毛毛 于 2024-8-6 08:09 编辑

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

  1. UPDATE
  2.     待更新表
  3. SET
  4.     待更新表.待更新字段 = 源数据表.源数据字段
  5. FROM
  6.     待更新表 INNER JOIN 源数据表 ON 待更新表.关联字段 = 源数据表.关联字段
复制代码


2、使用游标

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

评分

参与人数 1金币 +5 收起 理由
Lay.Li + 5 赞一个!

查看全部评分

回复 使用道具 举报
Lay.Li悬赏达人认证 活字格认证
超级版主   /  发表于:2024-8-6 10:15:45
3#
大佬,和您确认一下,这里分组后是组内序号从1开始呢

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
林小鱼
金牌服务用户   /  发表于:2024-8-6 10:44:33
4#
Lay.Li 发表于 2024-8-6 10:15
大佬,和您确认一下,这里分组后是组内序号从1开始呢

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

分组后是组内序号从1开始
回复 使用道具 举报
Lay.Li悬赏达人认证 活字格认证
超级版主   /  发表于:2024-8-6 12:29:51
5#
  1. WITH temptable AS (  
  2.     SELECT  
  3.         [模板id],  
  4.         [空间id],  
  5.         [整数],  
  6.         ROW_NUMBER() OVER (PARTITION BY [模板id], [空间id] ORDER BY [Details_ID] ASC) AS NewRowNum  
  7.     FROM  
  8.         [数据表1]  
  9. )  
  10. UPDATE yt  
  11. SET yt.序号= rd.NewRowNum  
  12. FROM  
  13.     [数据表1] yt  
  14. INNER JOIN temptable rd ON yt.[模板id] = rd.[模板id] AND yt.[空间id] = rd.[空间id] AND yt.[Details_ID] = rd.[Details_ID]  
  15.   
复制代码
您好,sql我们也不是很擅长,在网上搜了一下,您可以试试上方的sql语句


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
林小鱼
金牌服务用户   /  发表于:2024-8-6 15:08:04
6#
毛毛 发表于 2024-8-6 08:04
1、按detais_ID排序增加一个分组序号列,创建一个临时表,然后基于临时表更新这张表,用模板ID、空间ID、de ...

我卡在 这个分组序列号 怎么来?不还是回头最早了吗?
回复 使用道具 举报
Lay.Li悬赏达人认证 活字格认证
超级版主   /  发表于:2024-8-6 16:56:26
8#
感谢各位大佬的支持~
这里分组序列号,是用ROW_NUMBER()函数获取的,我这边儿使用上方的sql语句测试是可以的。您哪儿边使用上面的sql语句不可以么


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

回复 使用道具 举报
林小鱼
金牌服务用户   /  发表于:2024-8-6 17:09:25
9#
Lay.Li 发表于 2024-8-6 16:56
感谢各位大佬的支持~
这里分组序列号,是用ROW_NUMBER()函数获取的,我这边儿使用上方的sql语句测试是可以 ...

就用这个账号~还有喊我小鱼 就好了~在你们面前 我是学生
回复 使用道具 举报
Lay.Li悬赏达人认证 活字格认证
超级版主   /  发表于:2024-8-6 17:49:12
10#
您谦虚了,以后有关实际业务场景上的一些问题,可能还需要您的帮助呢
这边儿把伙伴系统的体验地址私发给您哈
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部