在 WHERE CLAUSE 查询中使用 row_num() 并使用来自 window 函数的过滤值

using row_num() and using filtering value from window function in WHERE CLAUSE query

我已经存储了 procedure.SELECT 声明如下

select  
*, row_number() OVER (ORDER BY ProductRN.ID) as RNN
from  (
SELECT 

p.ID
,p.ProductCode
,p.ProductNameF
,p.ProductNameE
,p.[Weight]
,p.PackageTypeID
,p.ISForeign
,p.BrandID
,b.BrandNameF
,b.BrandNameE
,p.ImgID
,p.CategoryID
,p.AmountInBox
,pc.PropertyGroupID
,p.Comment
,p.CompanyID
,p.Status
,po.CompanyNameF
,PriceConsumer=MKT.Fn_GetProductPrice(1,p.ID, @CurDate)
,PriceRetail=MKT.Fn_GetProductPrice(2,p.ID, @CurDate)
,PriceWholesale=MKT.Fn_GetProductPrice(3,p.ID, @CurDate)
,pg.PropertyName as PropertyGroupName
,b.LogoID
from mkt.Product as p (nolock)
inner join mkt.ProductCategory as pc (nolock) on pc.ID = p.CategoryID
inner join mkt.Brand b (nolock) on p.BrandID=b.ID
inner join MKT.ProductOwner as po (nolock) on po.ID = b.BrandOwnerID
left  join MKT.PropertyGroup as pg (nolock) on pc.PropertyGroupID=pg.ID

) AS  ProductRN 

where ProductRN.CompanyID=@CompanyID 
and  ProductRN.Status=1 
and  ProductRN.CategoryID=@ProductCategoryID
AND  (ProductRN.BrandID=@BrandID OR @BrandID=0)
--SOME WAY TO FILTER RNN

end

无法在 WHERE CLAUSE 中使用 RNN Column,因为我们不能在 WHERE CLAUSE 中使用 Column 别名和 window 函数。 实际上问题是当我把

row_number() OVER (ORDER BY ProductRN.ID) as RNN 

在内部 SELECT 语句中,RNN 列正好等于 p.ID (Product.ID) 似乎 sql 服务器首先计算 row_number() 并且然后执行 WHERE CLAUSE。

如何更改此查询,以便 row_num() 应用于最终查询记录 我可以在 WHERE CLAUSE 中过滤它。

使用子查询或 CTE:

select t.*
from (<your query goes here>) t
where rnn = 1;