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