2013-09-30 7 views
5

Ich versuche, eine bestimmte Zeilen aus meiner Tabelle mit der Row_number über. Der SQL-Befehl wird jedoch die Fehlermeldung "Ungültiger Spaltenname" ROWNUMBERS "" "auffordern. Jeder kann mich korrigieren?Row_Number Über Wo RowNumber zwischen

SELECT ROW_NUMBER() OVER (ORDER BY Price ASC) AS ROWNUMBERS, * 
FROM Product 
WHERE ROWNUMBERS BETWEEN @fromCount AND @toCount 
+2

ist Es ist definitiv nicht MySQL. –

Antwort

19

Der Versuch, die aliased Spalte in der WHERE Klausel zu verweisen, da der logische Abfrageverarbeitung stattfindet, funktioniert nicht. Die WHERE wird vor der SELECT Klausel ausgewertet. Daher ist die Spalte ROWNUMBERS nicht vorhanden, wenn WHERE ausgewertet wird. für Operationen

SELECT a.* 
FROM 
    (SELECT ROW_NUMBER() OVER (ORDER BY Price ASC) AS ROWNUMBERS, * 
    FROM Product) a 
WHERE a.ROWNUMBERS BETWEEN @fromCount AND @toCount 

Für Ihre Referenz, die Reihenfolge ist:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. Der richtige Weg, um die Spalte in diesem Beispiel wäre zu referenzieren

  5. HAVING
  6. SELECT
  7. ORDER BY
+0

@ 0070 [Hier ist eine Demo] (http://sqlfiddle.com/#!3/a1538/2) davon in Aktion. – Kermit

+2

Yay, 1000. Antwort! : D +1 – Doorknob

2

Es gibt eine andere Antwort hier, über die berichtet den spezifischen Fehler löst. Ich möchte jedoch auch das umfassendere Problem angehen. Es sieht sehr ähnlich aus, was Sie hier tun, ist Paging Ihre Ergebnisse für die Anzeige. Wenn das der Fall ist und Sie Sql Server 2012 verwenden können, gibt es jetzt einen besseren Weg. Werfen Sie einen Blick auf OFFSET/FETCH:

SELECT First Name + ' ' + Last Name 
FROM Employees 
ORDER BY First Name 
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY; 

, dass die dritte Seite einer Abfrage zeigen würde, wo die Seitengröße 5.