SQL ROW_NUMBER OVER语法

时间:2015-03-11 14:05:28

标签: sql sql-server window-functions

我有这个:

SELECT ROW_NUMBER() OVER (ORDER BY vwmain.ch) as RowNumber,
    vwmain.vehicleref,vwmain.capid,
    vwmain.manufacturer,vwmain.model,vwmain.derivative,
    vwmain.isspecial,
    vwmain.created,vwmain.updated,vwmain.stocklevel,
    vwmain.[type],
    vwmain.ch,vwmain.co2,vwmain.mpg,vwmain.term,vwmain.milespa
FROM vwMain_LATEST vwmain 
INNER JOIN HomepageFeatured 
  on vwMain.vehicleref = homepageFeatured.vehicleref 
WHERE homepagefeatured.siteskinid = 1
  AND homepagefeatured.Rotator = 1
  AND RowNumber = 1
ORDER BY homepagefeatured.orderby

“无效的列名称RowNumber”

失败

不确定如何以前缀来访问它?

由于

3 个答案:

答案 0 :(得分:2)

您无法像这样引用该字段。但是,您可以使用子查询或common-table-expression:

这是一个子查询:

SELECT *
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY vwmain.ch) as RowNumber,
        vwmain.vehicleref,vwmain.capid,
        vwmain.manufacturer,vwmain.model,vwmain.derivative,
        vwmain.isspecial,
        vwmain.created,vwmain.updated,vwmain.stocklevel,
        vwmain.[type],
        vwmain.ch,vwmain.co2,vwmain.mpg,vwmain.term,vwmain.milespa,
        homepagefeatured.orderby
    FROM vwMain_LATEST vwmain 
        INNER JOIN HomepageFeatured on vwMain.vehicleref = homepageFeatured.vehicleref 
    WHERE homepagefeatured.siteskinid = 1
       AND homepagefeatured.Rotator = 1
) T
WHERE RowNumber = 1
ORDER BY orderby

重新阅读您的查询,因为您没有按任何字段进行分区,最后的order by是无用的(它与排名函数的顺序相矛盾)。您最好使用top 1 ...

答案 1 :(得分:0)

使用top:

  SELECT top 1 vwmain.vehicleref,vwmain.capid,
        vwmain.manufacturer,vwmain.model,vwmain.derivative,
        vwmain.isspecial,
        vwmain.created,vwmain.updated,vwmain.stocklevel,
        vwmain.[type],
        vwmain.ch,vwmain.co2,vwmain.mpg,vwmain.term,vwmain.milespa,
        homepagefeatured.orderby
    FROM vwMain_LATEST vwmain 
        INNER JOIN HomepageFeatured on vwMain.vehicleref =   homepageFeatured.vehicleref 
    WHERE homepagefeatured.siteskinid = 1
       AND homepagefeatured.Rotator = 1
    ORDER BY homepagefeatured.orderby

答案 2 :(得分:0)

编辑:这个答案是附近的一个陷阱。我留下来作为文档。)

看看这里:Referring to a Column Alias in a WHERE Clause

这是同样的情况。

这是如何在内部解析/编译sql查询的问题,因此在解释where子句时不知道字段别名。因此,您可以参考上面的示例尝试:

SELECT ROW_NUMBER() OVER (ORDER BY vwmain.ch) as RowNumber,
vwmain.vehicleref,vwmain.capid, vwmain.manufacturer,vwmain.model,vwmain.derivative, vwmain.isspecial,vwmain.created,vwmain.updated,vwmain.stocklevel, vwmain.[type],
vwmain.ch,vwmain.co2,vwmain.mpg,vwmain.term,vwmain.milespa

FROM vwMain_LATEST vwmain 
  INNER JOIN HomepageFeatured on vwMain.vehicleref = homepageFeatured.vehicleref 

WHERE homepagefeatured.siteskinid = 1
  AND homepagefeatured.Rotator = 1
  AND ROW_NUMBER() OVER (ORDER BY vwmain.ch) = 1

ORDER BY homepagefeatured.orderby

因此,您会看到select语句中的表达式在where子句中完全重用。