请参阅下面的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&#39 ;,但是你不需要SELECT null?
答案 0 :(得分:3)
据我所知,这只是SQL Server的一个怪癖。 SQL Server不允许var scale:Number = .6;
var m:Matrix = new Matrix();
m.scale (scale,scale);
var bmp:BitmapData = new BitmapData(sourceMc.width, sourceMc.height, false);
bmp.draw (sourceMc,m);
中的常量(也不允许ORDER BY
中的常量,这可能出现在其他上下文中。)
这可能是GROUP BY
语句中的ORDER BY
子句的来源:
SELECT
其中“1”是列引用而不是常量。为了防止混淆,(我猜),语言的设计者不允许其他常量。毕竟,ORDER BY 1
会引用第三列吗?两列中值的总和?到常数3?
我认为这只是延续到了windows语法中。通过使用子查询,有一种解决方法 - 如您所见 - 。以下内容也应该有效:
ORDER BY 2 + 1
因为提到了一列,所以允许这样做。但是,ROW_NUMBER() ORDER BY (CASE WHEN NAME = NULL THEN 'Never Happens' ELSE 'Always' END)
永远不会返回true,因此常量用于排序。但是,我使用= NULL
子查询。
答案 1 :(得分:1)
Order By子句有4种基本语法结构。
您可以在此处查看MSDN文档。
https://msdn.microsoft.com/en-us/library/ms188385.aspx
我相信你的SELECT NULL,或者你想在order by子句中指定的任何常量都需要select,因为数据库引擎正在将常量作为#4结构,一个表达式进行计算。作为证据,在我的查询示例中,我使用COUNT(*)代替您的select null。
我相信当你在order by子句中指定Name或Group时,你实际上是按结构使用不同的顺序,可能是#1。以下是我的校对第一次和第二次查询排序操作的执行计划和结果的证明。我删除了分区,因为它与我们的讨论无关。
select row_number() over (order by (select null)),name from #names
select row_number() over (order by name),name from #names
select row_number() over (order by Gender),name from #names
如您所见,对传递给处理窗口函数的Segment运算符的数据不执行排序操作。这反映在这些查询的结果中,如下图所示。
基本上,SQL Server只是忽略或不对Order By子句子查询进行操作,因为它无法使用方法#4将您在子查询中返回的值与特定父列相关联您没有在Order By子查询中指定“SELECT name”,因为您实际上使用的是不同的Order By语法结构。