Речення ORDER BY недійсне у поданнях, вбудованих функціях, похідних таблицях, підзапитах та загальних виразах таблиць


77

Речення ORDER BY недійсне у поданнях, вбудованих функціях, похідних таблицях, підзапитах та загальних виразах таблиць, якщо також не вказано TOP, OFFSET або FOR XML.

Я отримую вищезазначену помилку під час спроби виконати наступний запит. Хто-небудь може, будь ласка, поглянути і сказати мені, що я тут роблю не так?

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   

2
порядок за не повинен бути поза підзапитом, вибраним, як повідомляється про помилку
Даніеле

Відповіді:


88

Вам не потрібно використовувати ORDER BYвнутрішній запит після WHEREречення, оскільки ви вже використовували його в 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 

25
Ні, ви не можете використовувати ORDER BY для сортування рядків у похідній таблиці з причини, зазначеної в повідомленні про помилку. Порядок рядків у наборі результатів в кінцевому підсумку контролюється реченням ORDER BY у зовнішньому SELECT, а не реченням OVER. Пункт OVER "визначає логічний порядок, в якому виконується розрахунок віконної функції". Це не сортує набір результатів.
Mike Sherrill 'Cat Recall'

13
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


4
Чи може хто-небудь запропонувати уявлення про те, чому Microsoft вимагає цього абсурдного зайвого додаткового синтаксису?
Чорний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.