SQL Server 2000: Ideen zum Ausführen einer Unterabfrage zur Verkettungsaggregation

Ich habe eine Abfrage, die die gewünschten Zeilen zurückgibt, z.

QuestionID  QuestionTitle  UpVotes  DownVotes  
==========  =============  =======  =========  
2142075     Win32: Cre...        0          0  
2232727     Win32: How...        2          0  
1870139     Wondows Ae...       12          0  

Jetzt möchte ich eine habenSäule zurückgegeben, die eine durch Kommas getrennte Liste von "Autoren(z. B. Originalposter und Herausgeber). z.

QuestionID  QuestionTitle  UpVotes  DownVotes  Authors
==========  =============  =======  =========  ==========
2142075     Win32: Cre...        0          0  Ian Boyd  
2232727     Win32: How...        2          0  Ian Boyd, roygbiv
1870139     Wondows Ae...       12          0  Ian Boyd, Aaron Klotz, Jason Diller, danbystrom


Es fälschen

SQL Server 2000 hat keineCONCAT(AuthorName, ', ') Aggregationsoperation, ich habe es vorgetäuscht - Durchführen einfacher Unterauswahlen für dieTOP 1 Autor, und der Autor zählen.

QuestionID  QuestionTitle  UpVotes  DownVotes  FirstAuthor  AuthorCount  
==========  =============  =======  =========  ===========  =========== 
2142075     Win32: Cre...        0          0  Ian Boyd               1 
2232727     Win32: How...        2          0  Ian Boyd               2
1870139     Wondows Ae...       12          0  Ian Boyd               3

Wenn es mehr als einen Autor gibt, zeige ich dem Benutzer Ellipsen ("…"), um anzuzeigen, dass es mehr als einen gibt. z.B. der Benutzer würde sehen:

QuestionID  QuestionTitle  UpVotes  DownVotes  Authors
==========  =============  =======  =========  ==========
2142075     Win32: Cre...        0          0  Ian Boyd
2232727     Win32: How...        2          0  Ian Boyd, …
1870139     Wondows Ae...       12          0  Ian Boyd, …

Und das funktioniert gut genug, da normalerweise einFrage wird nicht bearbeitet - was bedeutet, dass ich den 99% -Fall perfekt unterstütze und den 1% -Fall nur zur Hälfte-assed auch.


Threaded-Neuabfrage

Als kompliziertere und fehleranfällige Lösung dachte ich daran, die angezeigte Liste zu durchlaufen und für jeden Thread einen Thread-Pool-Worker-Thread zu erstellen. "Frage"Führen Sie in der Liste eine Abfrage für die Datenbank durch, um die Liste der Autoren abzurufen, und aggregieren Sie dann die Liste im Speicher. Dies würde bedeuten, dass die Liste zuerst in der (systemeigenen) Anwendung ausgefüllt wird. Anschließend stelle ich einige tausend einzelne Abfragen.

Aber das wäre schrecklich, schrecklich, schrecklich langsam. Ganz zu schweigen vom Bug-Rätsel, da es sich um Thread-Arbeit handelt.


ja Ja Ja

Adam Mechanicsagt ganz klar:

Verketten Sie Zeilen in SQL Server nicht zu durch Trennzeichen getrennten Zeichenfolgen. Tun Sie es Client-Seite.

Sag mir wie, und ich werde es tun.


/Schrei

Kann sich jemand eine bessere Lösung vorstellen, die so schnell ist (etwa ... in einer Größenordnung) wie meine ursprüngliche "TOP 1 plus Ellipsen" -Lösung?

Gibt es beispielsweise eine Möglichkeit, eine Ergebnismenge zurückzugeben, bei der der Zeile "reach" eine Ergebnismenge zugeordnet ist? So konnte ich für jede "Master" -Zeile eine "Detail" -Ergebnismenge erhalten, die die Liste enthält.


Code für die beste Antwort

Cade's Link zuAdam Machanics Lösung Ich mag das Beste. Eine benutzerdefinierte Funktion, die über Magie zu funktionieren scheint:

CREATE FUNCTION dbo.ConcatAuthors(@QuestionID int)
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @Output VARCHAR(8000)
    SET @Output = ''

    SELECT @Output =    CASE @Output 
                WHEN '' THEN AuthorName 
                ELSE @Output + ', ' + AuthorName 
                END
    FROM  (
        SELECT QuestionID, AuthorName, QuestionDate AS AuthorDate FROM Questions
        UNION
        SELECT QuestionID, EditorName, EditDate FROM QuestionEdits
    ) dt
    WHERE dt.QuestionID = @QuestionID
    ORDER BY AuthorDate

    RETURN @Output
END

Bei einer T-SQL-Verwendung von:

SELECT QuestionID, QuestionTitle, UpVotes, DownVotes, dbo.ConcatAuthors(AuthorID)
FROM Questions

Antworten auf die Frage(4)

Ihre Antwort auf die Frage