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一下别人的介绍。

你可能感兴趣的:(SQL)