2009-07-27 9 views
0

Ich habe eine Abfrage, die eine Reihe von Zeilen zurückgibt. Aber die gleiche Abfrage würde Ich mag an: die Gesamtzeilenanzahl in der Tabelle
2. die Zeilennummer erhaltenSQL erhalten Einzelwert innerhalb der bestehenden Abfrage?

1. erhalten, wo ein certian Benutzername

Gerade jetzt im befindet tun wie so:

BEGIN 
DECLARE @startRowIndex INT; 
DECLARE @PageIndex INT; 
DECLARE @RowsPerPage INT; 

SET @PageIndex = 0; 
SET @RowsPerPage = 15; 
SET @startRowIndex = (@PageIndex * @RowsPerPage) + 1; 

WITH messageentries 
     AS (SELECT Row_number() 
        OVER(ORDER BY score DESC) AS row, 
       Count(DISTINCT town.townid) AS towns, 
       user_details.username, 
       user_score.score, 
       allience.alliencename, 
       allience.allienceid, 
       allience.alliencetagname, 
       (SELECT Count(*) FROM user_details) AS numberofrows 
     FROM  user_details 
       INNER JOIN user_score 
        ON user_details.username = user_score.username 
       INNER JOIN town 
        ON user_details.username = town.townownername 
       LEFT OUTER JOIN allience_roles 
        ON user_details.useralliencerole = allience_roles.roleid 
       LEFT OUTER JOIN allience 
        ON allience_roles.allienceid = allience.allienceid 
     GROUP BY user_details.username, 
       user_score.score, 
       allience.alliencename, 
       allience.allienceid, 
       allience.alliencetagname) 
SELECT *, (SELECT row FROM messageentries WHERE username = 'myUsername') AS myself 
FROM messageentries 
WHERE row BETWEEN @startRowIndex AND @StartRowIndex + @RowsPerPage - 1 
END 

das funktioniert, ist aber nicht die beiden verschachtelten wählt einmal für jede Zeile in der Tabelle gehen laufen? :/

... 
    (SELECT Count(*) FROM user_details) AS numberofrows 
    ... 
    (SELECT row FROM messageentries WHERE username = 'myUsername') AS myself 

Also meine Frage ist, wie kann ich die Werte erhalten kann ich als „low-cost“ wie möglich und vorzugsweise in derselben Abfrage will?

Vielen Dank im Voraus :)

Antwort

1

try this ...

DECLARE @NumberOfRows INT 

SELECT @NumberOfRows = Count(*) FROM user_details 
WITH messageentries 
     AS (SELECT Row_number() 
        OVER(ORDER BY score DESC) AS row, 
       Count(DISTINCT town.townid) AS towns, 
       user_details.username, 
       user_score.score, 
       allience.alliencename, 
       allience.allienceid, 
       allience.alliencetagname, 
       @NumberOfRows AS numberofrows 
     FROM  user_details 
       INNER JOIN user_score 
        ON user_details.username = user_score.username 
       INNER JOIN town 
        ON user_details.username = town.townownername 
       LEFT OUTER JOIN allience_roles 
        ON user_details.useralliencerole = allience_roles.roleid 
       LEFT OUTER JOIN allience 
        ON allience_roles.allienceid = allience.allienceid 
     GROUP BY user_details.username, 
       user_score.score, 
       allience.alliencename, 
       allience.allienceid, 
       allience.alliencetagname) 
SELECT *, MyRowNumber.row AS myself 
FROM messageentries, 
     (SELECT row FROM messageentries WHERE username = 'myUsername') MyRowNumber 
WHERE row BETWEEN @startRowIndex AND @StartRowIndex + @RowsPerPage - 1 
+0

Yay, es funktioniert, aber irgendwie, wenn ich SELECT *, MyRowNumber.row AS selbst schreibe, bekomme ich zwei Spalten mit dem gleichen Wert, die Lösung war nicht MyRowNumber überhaupt zu wählen .. Wie der Wert dann in die Abfrage kommt Ich habe keine Ahnung, aber es funktioniert :) – Moulde

0
(SELECT Count(*) FROM user_details) 

Dieser wird im Cache gespeichert werden (die meisten materialisiert wahrscheinlich in einem Worktable).

(SELECT row FROM messageentries WHERE username = 'myUsername') 

Für diesen einen, wahrscheinlich ein Lazy Spool (oder Eager Spool) gebaut werden, der verwendet wird, um diesen Wert zu ziehen.

+0

Ich verstand die erste, aber Sie haben mich auf der zweiten verloren: P Aber danke, ich muss wirklich mehr SQL lernen, da viel mehr als ich dachte :) – Moulde

+0

@Moulde: Ein 'Spool' ist ein temporärer Index, der aus den Unterabfrageergebnissen gebildet wird (in Ihrem Fall ist es ein Index für' Benutzername'). Ein 'Eager Spool' indiziert alle Werte auf einmal, während ein' Lazy Spool' bereits indexierte Werte aus dem temporären Index zurückgibt und wenn nach einem Wert gefragt wird, der noch nicht indiziert ist, wird die Unterabfrage erneut gescannt und der Wert dem Index hinzugefügt . – Quassnoi

Verwandte Themen