SQL - 在查询结果中新增一列序号

我们经常会遇到这样一个问题,当从数据库查询出相应的数据后,没有唯一序号列,但有些前端框架会要求返回有唯一序号,无论这一列的序号是有序的还是无序的,只要保证唯一就可以。

那我知道的有下面几种办法:

1. 使用 数据库自带的序号函数

不同数据库的序号函数不一样,postgresql 是 ROW_NUMBER() OVER ()。

特点是 自增有序

SELECT
	ROW_NUMBER() OVER () AS id,
	material_no
		FROM
			"public"."workorder"
		WHERE
			material_no LIKE '%151%'
		LIMIT 10;

结果如下:

id	material_no
1	1511508C00
2	1511510A00
3	1511518A00
4	1511538A00
5	1512447A00
6	1514503A00
7	1514586A00
8	151A52ZC04

当然 row_number() over() 功能非常强大哦,有兴趣的可以看看 ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

2. 使用 SQL语句实现

这是根网上的办法实现的,真的很巧妙,直接上SQL。但生成序号列是 无序的

SELECT
	( SELECT COUNT (id) FROM "public"."workorder" AS A WHERE A . ID <= B."id" ) AS id,
	material_no
FROM
	"public"."workorder" AS B
WHERE
	material_no LIKE '%151%'
	LIMIT 10;

结果如下:

id	material_no
1	1551510C32
8	1511508C00
66	1514503A00
71	1511538A00
34	1512447A00
37	151A52ZC04
44	1511518A00
57	1511510A00
63	1514586A00
3	1551510C32

思路其实很简单, 将结果集中能确定一行数据唯一性的某列或多列组合成标识符,再把结果集中小于等于标识符的记录数合计成一列,从而满足需求。

3. 使用 临时表 (摘自)

SQL的IDENTITY函数可以提供自增的序号,但只能用在带有INTO table子句的SELECT语句中,所以如果可以使用临时表的情况下可以使用这种实现方法。和第一种方法一样,这种实现方法对我也不适用,因为现在的项目规定不能使用临时表。
eg:
SELECT IDENTITY(INT,1,1) as seq,field1,field2,...,fieldn INTO tmpTableName FROM srcTableName;
SELECT * FROM tmpTableName;
DROP TABLE tmpTableName;

不太懂临时表,就不多BB了。这里先mark一下别人的介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值