每日一SQL-重新编号
由于这几个月都在用Linq to SQL,以至于对 T-SQL语法陌生到不行。
但到底操作数据库的还是SQL语法,所以这种基本功还是不能忘比较好。
为了达到这个目标,就下定决心来个每日一SQL,不管是select、insert、或是内建函数都好
每天熟悉一种,一年就有365种,应该绰绰有余了吧。
今天刚好有个需求必须重新排一个 nvarchar类型的序号,所以就从这个开始吧
首先先建一个数据表"重新排序",字段如下
先来纪录一个上次别人教我的,如果要从不同数据库或是不同table,批次update或insert数据进来
可以这样写
INSERT INTO [My].[dbo].[重新排序]
([编号],[类],[标题])
select '00000000',CategoryName,Description
from Northwind.dbo.Categories
只要字段数量跟类型有对好,就会把后面那个select数据全部inset到前面的table(当然也可以下where条件)
结果( ID的字段我有给默认值 newid() )
好了之后
假设我想以类做排序,然后依序编号的话
首先要学的是怎么编号
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,再从右边取八位数
结果就是这样
order by之后看比较清楚
这样就解决啦。又学到一样东西。
原文:大专栏 每日一SQL-重新编号