2009-04-26 6 views

Antwort

3

In SQL Server 2005 (und 2008) können Sie die ROW_NUMBER function in Verbindung mit der OVER-Klausel verwenden, um die Reihenfolge zu bestimmen, in der die Zeilen gezählt werden sollen.

aktualisieren

Hmm. Ich weiß eigentlich nicht, was die Oracle-Version macht. Wenn es Ihnen eine eindeutige Nummer pro Zeile (über die gesamte Tabelle) gibt, bin ich mir nicht sicher, ob es eine Möglichkeit gibt, dies in SQL Server zu tun. SQL Server ROW_NUMBER() funktioniert nur für die Zeilen, die in der aktuellen Abfrage zurückgegeben werden.

1

Wenn Sie eine ID-Spalte haben, können Sie dies tun:

select a.*, 
(select count(*) from mytable b where b.id <= a.id) as rownum 
from mytable a 
order by id; 

Natürlich funktioniert dies nur, wenn Sie in der Lage sind rownums in der gleichen (oder umgekehrt), um so die Reihenfolge der bestellen IDs.

Wenn Sie eine echte Teilmenge von Zeilen auswählen, natürlich müssen Sie das gleiche Prädikat für die gesamte Auswahl und auf die Unterabfrage gelten:

select a.*, 
(select count(*) from table b where b.id <= a.id and b.foo = 'X') as rownum 
from table a where a.foo = 'X' 
order by id; 

Offensichtlich ist dies nicht besonders effizient ist.

+0

sehr ineffizient für SQL Server 2005 und höher – gbn

+0

Ja, wie ich bemerkt, oben. Aber wenn Sie es tun müssen, und Sie nicht 2005 oder höher haben, tun Sie, was Sie müssen. – tpdi

0

Basierend auf meinem Verständnis, müssten Sie ranking functions und/oder die TOP clause verwenden. Die SQL Server-Funktionen sind spezifisch, die Oracle-Version kombiniert die beiden Konzepte.

Die Ranking-Funktion ist einfach: Hier ist, warum Sie TOP verwenden würden. Hinweis: Sie können nicht WHERE auf ROWNUMBER direkt ...

'Orable: 
select 
    column_1, column_2 
from 
    table_1, table_2 
where 
    field_3 = 'some value' 
and rownum < 5 

--MSSQL: 
select top 4 
    column_1, column_2 
from 
    table_1, table_2 
where 
    field_3 = 'some value' 
Verwandte Themen