Php ms sql row_number()函数-不允许在同一语句中使用

Php ms sql row_number()函数-不允许在同一语句中使用,php,sql,sql-server,where,Php,Sql,Sql Server,Where,我对以下sql语句有一个错误: $sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE rownum >= 4"; 当我在查询之外使用名称(例如在foreach循环中)时,rownum会起作用,但当将其用作WHERE子句时,它永远不会起作用 有什么想法吗 谢谢像这样试试: $sql = "select siteid, row_number() OVER (ORDER BY

我对以下sql语句有一个错误:

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE rownum >= 4";
当我在查询之外使用名称(例如在foreach循环中)时,rownum会起作用,但当将其用作WHERE子句时,它永远不会起作用

有什么想法吗

谢谢

像这样试试:

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE row_number() >= 4";
不能在同一WHERE子句中使用列部分中定义的别名。WHERE子句还没有该信息。

一个选项是

将select语句包装到子select中 在外部查询中使用rownum别名 SQL语句


因为where子句是在计算窗口函数行数之前计算的,所以不能在where子句中包含该列

您可以按如下方式构造查询:

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE row_number() >= 4";
从select siteid中选择siteid,rownum从nwsite nw中选择rownum,其中rownum>=4


在这种情况下,将对内部查询进行整体计算,然后将其传递给外部查询,在外部查询中可以对rownum列进行操作。

使用公共表表达式:

with Result (field1, field2...,rn)
as
(select field1, field2..., rn=row_number() over (partition by field1 order by field 2)
from yourTable)
select * from result where rn<=3 ; -- top 3 in each group
您还可以在交叉应用中定义RowNum,这将允许您引用它

select siteid, 
       RowNum
FROM nwsite 
CROSS APPLY (SELECT row_number() OVER (ORDER BY siteid)) CxA(rownum)
WHERE rownum >= 4

我的理解是,分析函数是一个后处理步骤:一旦确定了结果集,就可以将该集提供给分析函数,以确定行数、前面的行数、后面的行数等。因此,分析函数不能包含在WHERE子句中,因为它在计算WHERE子句之后才应用。因此,在子查询中包装似乎通常是解决问题的方法。如果不进行子选择,having子句是否也会起作用?@MarcB不,您不能使用having子句,因为ms sql太差劲了。它在Mysql中非常好。@JasonFuller-行号在have之后运行,因此允许在那里引用它也没有任何意义。MySQL还没有来得及实现窗口函数。如果他们真的这样做了,那么他们在这个问题上缺乏对SQL标准的遵守将会对他们造成伤害。