每日一SQL-重新编号

每日一SQL-重新编号


由于这几个月都在用Linq to SQL,以至于对 T-SQL语法陌生到不行。

但到底操作数据库的还是SQL语法,所以这种基本功还是不能忘比较好。

为了达到这个目标,就下定决心来个每日一SQL,不管是select、insert、或是内建函数都好

每天熟悉一种,一年就有365种,应该绰绰有余了吧。

今天刚好有个需求必须重新排一个 nvarchar类型的序号,所以就从这个开始吧

首先先建一个数据表"重新排序",字段如下

db787128ecb047a48bb5294d8f746fc4

先来纪录一个上次别人教我的,如果要从不同数据库或是不同table,批次update或insert数据进来

可以这样写

INSERT INTO [My].[dbo].[重新排序]

([编号],[类],[标题])

select ‘00000000‘,CategoryName,Description 

from Northwind.dbo.Categories

只要字段数量跟类型有对好,就会把后面那个select数据全部inset到前面的table(当然也可以下where条件)

结果( ID的字段我有给默认值 newid()? )

374d6b4aa5ec43ee9fdd4d0644dd17a7

好了之后

假设我想以类做排序,然后依序编号的话

首先要学的是怎么编号

select *
, row_number() over(order by [类]) as rnk
from [My].[dbo].[重新排序]

row_number()这个function还满好用的,也可以用来做分页(不过自从有了Linq我就没用过了)

排序函数:ROW_NUMBER()、RANK() 与 DENSE_RANK()

会了之后,但还需要一样东西,因为我想要我的序号是八位数

不足的前面要补0,所以必须用其他的方法,好巧不巧保哥的博客前几天才发了一篇

T-SQL 技巧:产生“固定长度前面补零的数字字符串”

定期观看大师的博客果然只有好处没有坏处,需要用到的时候就知道好用

于是乎直接挑第三个范例来用,再稍微结合上面的语法

with 暂时table
as
(
select *
, row_number() over(order by [类]) as rnk
from [My].[dbo].[重新排序]
)
update 暂时table
set [编号] =  RIGHT( REPLICATE(‘0‘, 8) + CAST(rnk as NVARCHAR), 8)

基本上就是select 重新排序这个table加上一个按类排序的编号rnk,在给一个暂时的table名称

接着update他,再update时,将rnk转成字符串,加上replicate建立一个八位数的0,再从右边取八位数

结果就是这样

3f6ad223bd844bbbb620cb50eba9353f

order by之后看比较清楚

ebd08a5a1ede4e83a51ab113fd7d82d5

这样就解决啦。又学到一样东西。

原文:大专栏  每日一SQL-重新编号

相关文章
相关标签/搜索