请参阅下面的 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/