我正在尝试将select
部分中的行编号转移到服务器端。
我正在做以下工作:
SET @a=0;
SELECT @a:=@a+1, id
/*, other fields*/
FROM tmytable
WHERE (id >10) AND (id!= 73) /*etc.*/
order by id desc;
代码提供了我想要的内容:行的编号是正确的,而不考虑where
子句,顺序和其他情况。 然而,我想知道如何使声明更安全。 我假设并发会话可能同时处理同一个数据库变量,并且编号将从@a
的某个未定义值开始,不同于0+1
。 我希望排除事务和表锁定,因为我需要只读访问,而表锁定可能会降低DB性能。 有没有方法在select
语句中声明和插入变量?
不要使用变量。 使用row_number()
:
SELECT row_number() over (order by id desc), id
#, other fields
FROM tmytable
WHERE (id > 10) AND (id <> 73) #etc.
ORDER BY id DESC;
我不知道你说的“安全”是什么意思。 这是一个SQL查询,它将作为一个单元运行,独立于其他会话(在大多数情况下)。