SQL 第一列增加自然数

好奇都是要学的 2021-04-19 09:40:50
有名字的地方 加自然数 1 2 3 4往下排

我想的办法 取名字不等于空 再用row_rand排序 插入临时表,
然后在用update from 把临时表生成的拍序列插回 这个表
觉得麻烦,看看贴吧大神有没有更好的方法,学习了
...全文
358 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2021-04-20
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(
	[id] INT IDENTITY(1,1) PRIMARY KEY,
	[name] NVARCHAR(10)	
)
GO
INSERT INTO t([name]) VALUES('张三')
INSERT INTO t([name]) VALUES('李四')
INSERT INTO t([name]) VALUES('')
INSERT INTO t([name]) VALUES('王五')
---- 以上为测试表及测试数据 ----

;WITH noEmpty AS(
	SELECT ROW_NUMBER() OVER (ORDER BY id) AS rid,*
	FROM t	
	WHERE ISNULL([name],'')!=''
)
SELECT B.rid,A.[name] 
FROM t AS A LEFT JOIN noEmpty AS B
	ON A.id=B.id
Hello World, 2021-04-20
  • 打赏
  • 举报
回复
是一样的啊,写法不同而已
  • 打赏
  • 举报
回复
引用 2 楼 Hello World, 的回复:
借用楼上的数据:

DECLARE @t TABLE(
	[id] INT IDENTITY(1,1) PRIMARY KEY,
	seq INT NULL,
	[name] NVARCHAR(10)	
)

INSERT INTO @t([name]) VALUES('张三')
INSERT INTO @t([name]) VALUES('李四')
INSERT INTO @t([name]) VALUES('')
INSERT INTO @t([name]) VALUES('王五')
---- 以上为测试表及测试数据 ----

DECLARE @seq INT=0;
UPDATE t SET seq=@seq,@seq=@seq+1 FROM @t t  WHERE t.name<>''

SELECT * FROM @t
id seq name ----------- ----------- ---------- 1 1 张三 2 2 李四 3 NULL 4 3 王五 (4 行受影响)
你的这个 改成 DECLARE @seq INT=0; UPDATE @t SET seq=@seq,@seq=@seq+1 WHERE name<>'' 结果是一样的
  • 打赏
  • 举报
回复
引用 2 楼 Hello World, 的回复:
借用楼上的数据:

DECLARE @t TABLE(
	[id] INT IDENTITY(1,1) PRIMARY KEY,
	seq INT NULL,
	[name] NVARCHAR(10)	
)

INSERT INTO @t([name]) VALUES('张三')
INSERT INTO @t([name]) VALUES('李四')
INSERT INTO @t([name]) VALUES('')
INSERT INTO @t([name]) VALUES('王五')
---- 以上为测试表及测试数据 ----

DECLARE @seq INT=0;
UPDATE t SET seq=@seq,@seq=@seq+1 FROM @t t  WHERE t.name<>''

SELECT * FROM @t
id seq name ----------- ----------- ---------- 1 1 张三 2 2 李四 3 NULL 4 3 王五 (4 行受影响)
这样也可以吗。我昨天也起了一个变量DECLARE 但是没想到如何让变量加一。 原来可以@seq=@seq+1 写到FORM 里啊。 学到了,学到了
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(
	[id] INT IDENTITY(1,1) PRIMARY KEY,
	[name] NVARCHAR(10)	
)
GO
INSERT INTO t([name]) VALUES('张三')
INSERT INTO t([name]) VALUES('李四')
INSERT INTO t([name]) VALUES('')
INSERT INTO t([name]) VALUES('王五')
---- 以上为测试表及测试数据 ----

;WITH noEmpty AS(
	SELECT ROW_NUMBER() OVER (ORDER BY id) AS rid,*
	FROM t	
	WHERE ISNULL([name],'')!=''
)
SELECT B.rid,A.[name] 
FROM t AS A LEFT JOIN noEmpty AS B
	ON A.id=B.id
你这个方法和我想的一样
Hello World, 2021-04-20
  • 打赏
  • 举报
回复
借用楼上的数据:

DECLARE @t TABLE(
	[id] INT IDENTITY(1,1) PRIMARY KEY,
	seq INT NULL,
	[name] NVARCHAR(10)	
)

INSERT INTO @t([name]) VALUES('张三')
INSERT INTO @t([name]) VALUES('李四')
INSERT INTO @t([name]) VALUES('')
INSERT INTO @t([name]) VALUES('王五')
---- 以上为测试表及测试数据 ----

DECLARE @seq INT=0;
UPDATE t SET seq=@seq,@seq=@seq+1 FROM @t t  WHERE t.name<>''

SELECT * FROM @t
id seq name ----------- ----------- ---------- 1 1 张三 2 2 李四 3 NULL 4 3 王五 (4 行受影响)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧