programing

ORDER BY 절이 뷰, 인라인 함수, 파생된 테이블, 하위 쿼리 및 일반 테이블 식에 유효하지 않습니다.

bestprogram 2023. 4. 17. 22:36

ORDER BY 절이 뷰, 인라인 함수, 파생된 테이블, 하위 쿼리 및 일반 테이블 식에 유효하지 않습니다.

TOP, OFFSET 또는 FOR XML을 지정하지 않는 한 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   

사용할 필요가 없습니다.ORDER BY에 대한 내밀한 질문에서WHEREclause는 이미 사용하였기 때문에ROW_NUMBER() OVER (ORDER BY VRDATE DESC).

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 
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명령을 받다ColX

그리고 그 결과는MainCol = 0명령을 받다ColY

제 경우 "Inline Table-Value User Defined Function"을 사용하여 주문을 수행하려고 했습니다.그리고 나는 예외보다 낮아지고 있었다.

TOP, OFFSET 또는 FOR XML을 지정하지 않는 한 ORDER BY 절은 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 일반 테이블 식에서 사용할 수 없습니다.

솔루션 I을 Multiline Statement Table-Values Function으로 변경하여 동작하기 시작했습니다.

이렇게 하려면 SQL에서 데이터를 바로 반환하지 않고

  1. 테이블 변수와 열을 정의했습니다.
  2. 내 UDF 본체에서 데이터를 채웠다.
  3. 돌아가다

제 경우 select top xyz를 추가하는 것이 효과가 있었습니다.

언급URL : https://stackoverflow.com/questions/18031421/the-order-by-clause-is-invalid-in-views-inline-functions-derived-tables-subqu