2017-08-07 32 views
0

就像下面使用ROW_NUM(),並使用從窗函數過濾值在那裏我有存儲procedure.SELECT聲明CLAUSE查詢

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 [email protected] 
and ProductRN.Status=1 
and [email protected] 
AND ([email protected] OR @BrandID=0) 
--SOME WAY TO FILTER RNN 

end 

沒有任何方式,使用WHERE子句因爲我們可以RNN列在WHERE子句中使用列別名和窗口函數。 實際問題是,當我把

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

內的SELECT語句中,RNN列正好相等p.ID(Product.ID)似乎SQL服務器首先計算ROW_NUMBER(),然後執行WHERE子句。

如何更改此查詢,以便row_num()適用於最終查詢記錄 ,我可以在WHERE CLAUSE中對其進行過濾。

回答

4

使用子查詢或CTE:

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

它的工作原理。 非常感謝。但劑量使用多個嵌套選擇語句使查詢變慢?有沒有什麼快捷方式? –

+0

@MahdiYusefi。 。 。不,SQL Server有一個好的優化器。 –