복붙노트

[SQL] ORDER BY 절은 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 표현식에서 유효하지 않습니다

SQL

ORDER BY 절은 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 표현식에서 유효하지 않습니다

다음 쿼리를 실행하는 동안 나는 말했다 오류 위를 얻고있다. 사람은 모양과 내가 여기에 잘못을하고있는 중이 야 무엇을 말해 주시겠습니까?

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 stockmain.etype='purchase' 
    ORDER BY VRDATE DESC
) AS MyDerivedTable
WHERE 
    MyDerivedTable.RowNum BETWEEN 1 and 5   

해결법

  1. ==============================

    1.당신은 절 이미 ROW_NUMBER () OVER (ORDER BY VRDATE DESC)에 사용했기 때문에 WHERE 후 내부 쿼리에서 ORDER BY를 사용할 필요가 없습니다.

    당신은 절 이미 ROW_NUMBER () OVER (ORDER BY VRDATE DESC)에 사용했기 때문에 WHERE 후 내부 쿼리에서 ORDER BY를 사용할 필요가 없습니다.

    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 
    
  2. ==============================

    2.

    ORDER BY column OFFSET 0 ROWS
    

    놀랍게도 작업, 어떤 이상한 기능을한다.

    나중에 다시 주문을 긴 쿼리 일시적으로 "저장"할 수있는 방법으로 CTE와 더 큰 예 :

    ;WITH cte AS (
        SELECT .....long select statement here....
    )
    
    SELECT * FROM 
    (
        SELECT * FROM 
        ( -- necessary to nest selects for union to work with where & order clauses
            SELECT * FROM cte WHERE cte.MainCol= 1 ORDER BY cte.ColX asc OFFSET 0 ROWS 
        ) first
        UNION ALL
        SELECT * FROM 
        (  
            SELECT * FROM cte WHERE cte.MainCol = 0 ORDER BY cte.ColY desc OFFSET 0 ROWS 
        ) last
    ) as unionized
    ORDER BY unionized.MainCol desc -- all rows ordered by this one
    OFFSET @pPageSize * @pPageOffset ROWS -- params from stored procedure for pagination, not relevant to example
    FETCH FIRST @pPageSize ROWS ONLY -- params from stored procedure for pagination, not relevant to example
    

    우리가 얻을 그래서 모든 결과는 MainCol으로 정렬

    그러나 MainCol = 1 GET과 결과는 ColX으로 정렬

    그리고 MainCol = 0 GET과 결과는 ColY으로 정렬

  3. from https://stackoverflow.com/questions/18031421/the-order-by-clause-is-invalid-in-views-inline-functions-derived-tables-subqu by cc-by-sa and MIT license