Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 生成行号而不对任何列排序_Sql_Sql Server_Firebird - Fatal编程技术网

Sql 生成行号而不对任何列排序

Sql 生成行号而不对任何列排序,sql,sql-server,firebird,Sql,Sql Server,Firebird,我想按照添加数据的相同顺序生成行号。 下面的查询在SQL Server上运行良好 SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO FROM TestTable 我需要标准查询来在Firebird中实现相同的场景。有人能给我推荐一下吗 不能在Firebird中使用orderbyselect 100上的row_number,因为Firebird需要一个from子句来表示select。Firebird中的等价项是通过从rdb$数据库

我想按照添加数据的相同顺序生成行号。 下面的查询在SQL Server上运行良好

SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO FROM TestTable
我需要标准查询来在Firebird中实现相同的场景。有人能给我推荐一下吗

不能在Firebird中使用orderbyselect 100上的row_number,因为Firebird需要一个from子句来表示select。Firebird中的等价项是通过从rdb$数据库中选择100来获得订单上的行数

最好的解决方案是使用orderby的实际列,以确保确定的顺序

查看SQL:2016标准时,行数不需要order by,但秩和密集秩则需要order by。不幸的是,看起来微软也应用了对行数的要求,可能是为了与秩函数的一致性,可能是因为没有顺序的行数没有多大意义。在SQL Server中使用row_number over会产生错误函数“row_number”必须具有ORDER BY.的over子句,但可用于Firebird

SQL Server还强制窗口函数中的order by不是数字列引用。在SQL Server中使用order by 1上的row_number会产生一个错误。带窗口的函数、函数的聚合和下一个值不支持order by子句表达式形式的整数索引,但可用于Firebird,尽管1被视为文字1,而不是列引用,这与select级别上的order by相反

SQL Server也不支持在窗口函数的order by中使用常量或文字。在SQL Server中使用order by“1”上的row_number会生成一个错误窗口函数,函数的聚合和下一个值不支持常量作为order by子句表达式,但可用于Firebird

我确实发现了一个适用于Firebird 3和SQL Server 2017的技巧,但它是一个肮脏的黑客:

row_number() over (order by current_user)

这是因为SQLServer不把CurrnEngUL看作常量,而是作为一个函数,这意味着它不属于“不允许常量”的规则。 请注意,此技巧可能会产生不一致的行号,例如在Firebird中,使用不同常数计算的多个窗口函数将产生不同的值,并且窗口函数在选择级别上的order by之前进行计算,您可能想考虑如果您不应该简单地跟踪应用程序中的行索引。

< P> >一种方式可以是使用RAND的顺序:


试着把…移走。。。。条款或者按1重试ORDER,这表明Firebird 3可以有空的OVER子句:SELECT*,来自TestTable的SNO上的行数-请参见-但是,您在示例查询中使用的窗口函数是在SQL 2003 AFAIR中引入的,而不是SQL 92可能的重复
CREATE TABLE TestTable(i INT);
INSERT INTO TestTable(i) VALUES (10);
INSERT INTO TestTable(i) VALUES (20);
INSERT INTO TestTable(i) VALUES (30);

SELECT TestTable.*,ROW_NUMBER() OVER (ORDER BY RAND()) AS SNO 
FROM TestTable;