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 上执行此查询,但它一直给出此错误

列名“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 

但是数据中的数据是巨大的,使用这个查询会减慢检索过程,所以我修改了上面的查询,现在我得到了这个未定义列的错误。

4

3 回答 3

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

于 2013-08-04T06:20:50.467 回答
3

放在子查询ROW_NUMBER()中,子句中不能WHERE使用,更何况子句中不能使用SELECT列表中创建的别名WHERE

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会有所帮助。

于 2013-08-04T05:50:32.840 回答
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 语句之后将其删除。

于 2013-08-04T06:16:08.887 回答