sql - 分区中的 ORDER BY - SELECT 关键字

标签 sql sql-server tsql window-functions

请参阅下面的 DDL:

create table #names (name varchar(20), Gender char(1))
    insert into #names VALUES ('Ian', 'M')
    insert into #names values ('Marie', 'F')
    insert into #names values ('andy', 'F')
    insert into #names values ('karen', 'F')

和下面的 SQL:

select row_number() over (order by (select null)) from #names

这会为每一行添加一个唯一的编号。我也可以这样做(这不会添加唯一的行):

select row_number() over (partition by gender order by (name)) from #names

为什么不需要“SELECT name”,但不需要 SELECT null?

最佳答案

据我所知,这只是 SQL Server 的一个怪癖。 SQL Server 不允许在 ORDER BY 中使用常量(也不允许在 GROUP BY 中使用常量,后者可能出现在其他上下文中)。

这可能源于 SELECT 语句中的 ORDER BY 子句:

ORDER BY 1

其中“1”是列引用而不是常量。为了防止混淆(我猜测),语言的设计者不允许存在其他常量。毕竟,ORDER BY 2 + 1 会引用第三列吗?两列中的值之和?到常数3?

我认为这只是被带入了 Windows 语法中。正如您所看到的,有一种方法可以解决这个问题,即使用子查询。以下内容也应该有效:

ROW_NUMBER() ORDER BY (CASE WHEN NAME = NULL THEN 'Never Happens' ELSE 'Always' END)

因为提到了列,所以这是允许的。但是,= NULL 永远不会返回 true,因此使用常量进行排序。不过,我使用 SELECT NULL 子查询。

关于sql - 分区中的 ORDER BY - SELECT 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863497/

相关文章:

sql - 插入大量记录而不锁定表

sql-server - "Failed to lock variable"SSIS错误

mysql - SELECT 语句中表达式的执行顺序

sql - 美国 Zip(邮政编码)的 Mysql 数据类型

mysql - 我如何在 SQL 中获取整个商店列表

sql-server - 未为RPC配置服务器

java - 使用 Maven 构建的可执行 Jar 无法在运行时解决多个数据库驱动程序的依赖关系

sql-server - 检查约束不允许我添加数据

sql - 将任何查询结果转换为字符串

具有多列的 SQL 案例