SQL Server 2000: идеи для выполнения подзапроса агрегации агрегации

у меня есть запрос, который возвращает строки, которые я хочу, например,

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

Теперь я хочу иметьколонка возвращается, который содержит разделенный запятыми список "Авторы"(например, оригинальный постер и редакторы). Например:

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


Подделывая это

SQL Server 2000 не имеетCONCAT(AuthorName, ', ') Операция агрегации, я притворяюсь - выполняю простые подвыборки дляTOP 1 Автор и автор считают.

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

Если существует более одного автора, я показываю пользователю эллипсы («…»), чтобы указать, что их больше одного. например пользователь увидит:

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, …

И это работает достаточно хорошо, так как обычновопрос не редактируется - это означает, что я полностью поддерживаю дело 99%, а дело 1% - только половину-assed также.


Резьбовой повторный запрос

Как более сложное и подверженное ошибкам решение, я подумал об итерации отображаемого списка и обкатке рабочего потока пула потоков для каждого »вопрос"в списке выполните запрос к базе данных, чтобы получить список авторов, затем агрегируйте список в памяти. Это будет означать, что список сначала заполняется в (нативном) приложении. Затем я выполняю несколько тысяч отдельных запросов впоследствии.

Но это было бы ужасно, ужасно, ужасно, медленно. Не говоря уже об ошибках, поскольку это будет работа с потоками.


Да да да

Адам Механикпрямо говорит:

Не объединяйте строки в строки с разделителями в SQL Server. Сделай это на стороне клиента.

Скажи мне как, и я сделаю это.


/плач

Может ли кто-нибудь придумать лучшее решение, такое же быстрое (скажем, в пределах порядка), чем мое оригинальное решение «ТОП 1 плюс эллипсы»?

Например, есть ли способ вернуть набор результатов, где в строке достижения есть связанный набор результатов? Таким образом, для каждой «основной» строки я мог бы получить «подробный» набор результатов, который содержит список.


Код для лучшего ответа

КАДЕ ссылка наРешение Адама Маханича мне нравится больше всего Пользовательская функция, которая, кажется, работает через магию:

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

С использованием T-SQL:

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

Ответы на вопрос(4)

Ваш ответ на вопрос