2 Stimmen

Sortierung nach neu ausgewählter Spalte

Ich habe eine Anfrage wie:

SELECT 
    R.*     
FROM 
    (SELECT A, B, 
            (SELECT smth from another table) as C,
     ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber 
     FROM SomeTable) R
WHERE 
     RowNumber BETWEEN 10 AND 20

Dies führt zu einer Fehlermeldung bei ORDER BY C DESC .

Da ich verstehe, warum dieser Fehler auftritt, habe ich mir überlegt, eine weitere SELECT con ORDER BY und erst dann Zeilen von 10 bis 20 auswählen. Aber ich glaube nicht, dass es gut ist, 3 verschachtelte SELECT Befehle.

Wie ist es sonst möglich, diese Zeilen auszuwählen?

2voto

Michael Buen Punkte 37103

Eine Spalte kann sich nicht auf einen Alias auf derselben Ebene beziehen, Sie müssen sie zuerst in einer Tabelle ableiten oder CTE verwenden.

SELECT 
    R.* , ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber     
FROM 
    (SELECT A, B, (SELECT smth from another table) as C
     FROM SomeTable) R
-- WHERE 
     -- but you still cannot do this
     -- RowNumber BETWEEN 10 AND 20

Sie müssen dies tun:

select S.*
from
(
    SELECT 
        R.* , ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber     
    FROM 
        (SELECT A, B, 
                (SELECT smth from another table) as C
         FROM SomeTable) R
) as s
where s.RowNumber between 10 and 20

Um tiefe Verschachtelungen zu vermeiden und um es zumindest angenehm aussehen zu lassen, verwenden Sie CTE:

with R as
(
     SELECT A, B, (SELECT smth from another table) as C
     FROM SomeTable
)
,S AS 
(
    SELECT R.*, ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber
    FROM R
)
SELECT S.*
FROM S
WHERE S.RowNumber BETWEEN 1 AND 20

1voto

Sergey Kalinichenko Punkte 694383

Sie können keine geänderten Spalten in der gleichen SELECT aber Sie können es in ein anderes Select einbinden, damit es funktioniert:

SELECT R.*
FROM (SELECT ABC.A, ABC.B, ABC.C, ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber
      FROM (SELECT A, B, (SELECT smth from another table) as C FROM SomeTable) ABC 
) R
WHERE R.RowNumber BETWEEN 10 AND 20

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X