2013-08-04 67 views
0
SELECT 
     Stockmain.VRNOA, 
     item.description as item_description, 
     party.name as party_name, 
     stockmain.vrdate, 
     stockdetail.qty, 
     stockdetail.rate, 
     stockdetail.amount, 
     ROW_NUMBER() OVER (ORDER BY VRDATE) AS RowNum 
    FROM StockMain 
    INNER JOIN StockDetail 
     ON StockMain.stid = StockDetail.stid 
    INNER JOIN party 
     ON party.party_id = stockmain.party_id 
    INNER JOIN item 
     ON item.item_id = stockdetail.item_id 
    WHERE stockmain.etype='purchase' AND RowNum BETWEEN 1 and (1 + 100) 
    ORDER BY VRDATE DESC 

我試圖執行SQL Server上的這個查詢,並不斷給這個錯誤SQL錯誤

無效列名「ROWNUM」。

任何人都可以請看看,並告訴我我在做什麼錯在這裏?

更新

我最初使用的查詢是

SELECT 
    * 
FROM (
    SELECT 
     Stockmain.VRNOA, 
     item.description as item_description, 
     party.name as party_name, 
     stockmain.vrdate, 
     stockdetail.qty, 
     stockdetail.rate, 
     stockdetail.amount, 
     ROW_NUMBER() OVER (ORDER BY VRDATE DESC) AS RowNum --< ORDER BY 
    FROM StockMain 
    INNER JOIN StockDetail 
     ON StockMain.stid = StockDetail.stid 
    INNER JOIN party 
     ON party.party_id = stockmain.party_id 
    INNER JOIN item 
     ON item.item_id = stockdetail.item_id 
    WHERE stockmain.etype='purchase' 
) AS MyDerivedTable 
WHERE 
    MyDerivedTable.RowNum BETWEEN 1 and 5 

但在數據中的數據是巨大的,使用此查詢減慢檢索過程,所以我修改了查詢如上現在我收到未定義列的這個錯誤。

+0

您使用的是什麼版本的TSQL? –

+0

'的Microsoft SQL Server 2012(SP1) - 11.0.3128.0(英特爾X86) \t 2012年12月28日19時06分41秒 \t版權所有(c)Microsoft公司 \t Express版本在Windows NT 6.2 (建設9200:)' –

回答

4

它看起來像你想進行分頁操作,或者至少是在SQL Server 2012中使用新的尋呼運營商大大簡化了查詢,OFFSET和FETCH:

SELECT 
     Stockmain.VRNOA, 
     item.description as item_description, 
     party.name as party_name, 
     stockmain.vrdate, 
     stockdetail.qty, 
     stockdetail.rate, 
     stockdetail.amount 
    FROM StockMain 
    INNER JOIN StockDetail 
     ON StockMain.stid = StockDetail.stid 
    INNER JOIN party 
     ON party.party_id = stockmain.party_id 
    INNER JOIN item 
     ON item.item_id = stockdetail.item_id 
    WHERE stockmain.etype='purchase' 
    ORDER BY VRDATE DESC 
    OFFSET 0 ROWS 
    FETCH NEXT 100 ROWS ONLY 

欲瞭解更多信息請參閱以下內容:http://www.dbadiaries.com/new-t-sql-features-in-sql-server-2012-offset-and-fetch

3

把它放在一個子查詢,該ROW_NUMBER()不能在WHERE子句中使用,更何況你不能WHERE子句中使用的SELECT列表中創建別名:

SELECT * 
FROM (SELECT 
      Stockmain.VRNOA, 
      item.description as item_description, 
      party.name as party_name, 
      stockmain.vrdate, 
      stockdetail.qty, 
      stockdetail.rate, 
      stockdetail.amount, 
      ROW_NUMBER() OVER (ORDER BY VRDATE) AS RowNum 
     FROM StockMain 
     INNER JOIN StockDetail 
      ON StockMain.stid = StockDetail.stid 
     INNER JOIN party 
      ON party.party_id = stockmain.party_id 
     INNER JOIN item 
      ON item.item_id = stockdetail.item_id 
     WHERE etype='purchase' 

)sub 
WHERE RowNum BETWEEN 1 and (1 + 100)  
ORDER BY VRDATE DESC 

更新:在看到更新後,很明顯你已經有了一個工作查詢,但正試圖優化它,即使你可以在主查詢中移動ROW_NUMBER()它不會提高性能,它仍然必須對整個數據執行密集的ORDER組。索引VRDATE將有所幫助。

+0

感謝您的回覆,請看看這個問題,我已經添加了一些細節。 –

0

這是您需要使用內存表或臨時表的情況;

使用內存表;

DECLARE @Table TABLE(ROWID int identity,<all your columns>) 
INSERT INTO @Table (<your columns>) 
SELECT 
     Stockmain.VRNOA, 
     item.description as item_description, 
     party.name as party_name, 
     stockmain.vrdate, 
     stockdetail.qty, 
     stockdetail.rate, 
     stockdetail.amount, 
     ROW_NUMBER() OVER (ORDER BY VRDATE) AS RowNum 
    FROM StockMain 
    INNER JOIN StockDetail 
     ON StockMain.stid = StockDetail.stid 
    INNER JOIN party 
     ON party.party_id = stockmain.party_id 
    INNER JOIN item 
     ON item.item_id = stockdetail.item_id 
    WHERE etype='purchase' 

    SELECT <columns you need> FROM @Table 

如果您使用#temp表,請務必在SELECT語句後刪除它。