SQL ROW_NUMBER OVER 语法

SQL ROW_NUMBER OVER syntax

我有这个:

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

"Invalid column name RowNumber"

失败

不确定如何为其添加前缀以访问它?

谢谢

你不能那样引用字段。但是,您可以使用子查询或常见的 table 表达式:

这是一个子查询:

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...

使用顶部:

  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

(编辑:这个答案是一个附近的陷阱。我把它留作文档。)

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

这是同样的情况。

sql 查询在内部如何 parsed/compiled 是一个问题,因此在解释 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 子句中完全重用。