2013-08-04 24 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语句后删除它。