我想将ROW_NUMBER()
的开头定义为3258170
而不是1
。
我正在使用以下SQL查询
SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'.
但是,上述查询无效。当我说不工作时,我的意思是它的执行,但它不是从3258170
开始。有人能帮助我吗?
我想指定行号的原因是我将Rows从一个表插入另一个表。在第一个表中,最后一个记录的行号是3258169
,当我插入新记录时,我希望它们具有来自3258170
的行号。
只需将值添加到row_number()
的结果中:
select 3258170 - 1 + row_number() over (order by (select NULL)) as idd
order by
的row_number()
子句指定了用于订单的列。通过在那里指定一个常量,你只是说“一切都有相同的价值用于订购目的”。它没有任何东西,没有任何与选择的第一个值有关。
为避免混淆,我用NULL替换了常量值。在SQL Server中,我观察到这会分配一个序列号,而不会对行进行实际排序 - 观察到的性能优势,但不是我见过的文档,因此我们不能依赖它。
我觉得这更容易
ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0)
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170)
有时....
ROW_NUMBER()可能不是最佳解决方案,尤其是当底层数据集中存在重复记录时(对于JOIN查询等)。这可能导致返回的行数超出预期。您可以考虑创建一个SEQUENCE,在某些情况下可以认为是一个更清洁的解决方案。即:
CREATE SEQUENCE myRowNumberId
START WITH 1
INCREMENT BY 1
GO
SELECT NEXT VALUE FOR myRowNumberId AS 'idd' -- your query
GO
DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves
GO
缺点是序列可能难以在具有DISTINCT,WINDOW函数等的复杂查询中使用。请参阅完整的序列文档here。