Является ли COALESCE лучшим способом достичь этого? - PullRequest
4 голосов
/ 13 января 2010

Просто хочу посмотреть, есть ли у кого-нибудь лучший способ выполнить то, что мне нужно.

Сначала фон. У меня есть таблица в моей базе данных, которая в настоящее время имеет около 20000 строк. В таблице у нас есть столбец для FirstName и LastName. Существует также столбец, который является ReferenceID. Для каждого ReferenceID может быть несколько комбинаций FirstName и LastName.

Это означает, что когда мы делаем * выбор из таблицы, мы получаем несколько строк назад для каждого ReferenceID (поскольку для каждого пользователя есть строка).

Я хочу объединить эти два столбца в столбце с именем Name одновременно с получением каждой строки для ReferenceID и превращением его в один. (В основном сглаживают данные).

Позвольте мне попытаться нарисовать здесь диаграмму ascii.

TABLE
ID        ReferenceID        FirstName        LastName
________________________________________________
1         1                  Mike             Ekim
2         1                  Tom              Mot
3         1                  Pete             Etep
4         2                  Ryan             Nayr
5         3                  Jerry            Yrrej

Итак, конечным результатом того, что я хотел бы, является набор, такой как

RESULT SET
ReferenceID   Name
__________________________________
1              Mike Ekim, Tom Mot, Pete Etep
2              Ryan Nayr
3              Jerry Yrrej

Что мне действительно нужно знать, прежде чем я начну свой путь с COALESCE и попробую изменить результаты, есть ли лучший способ сделать это? Использование SQL Server 2005.

Приветствия

Mike

Ответы [ 5 ]

3 голосов
/ 13 января 2010

Вот как вы это делаете с техникой xml path (там тоже есть слияние ...)

SELECT DISTINCT n.ReferenceID,
STUFF((SELECT ', ' + COALESCE(n2.FirstName+' '+n2.LastName,n2.FirstName,n2.LastName,'NoName') 
    FROM namelist n2
    WHERE n.referenceid = n2.referenceid
    ORDER BY n2.lastname, n2.firstname
    FOR XML PATH('')
  ), 1, 2, '') AS [Name]
FROM namelist n
2 голосов
/ 13 января 2010

Эта тема рассматривается в этой статье: Объединение значений строк в Transact-SQL . Существует несколько методов (XML PATH, рекурсивные CTE, CLR, рекурсивные UDF, на основе курсора, конкатенация переменных), и каждый из них представлен вкратце, а комментарии и связанные источники из этой статьи более подробно освещают эту тему.

Моя любимая техника - XML ​​PATH (как уже писал Andomar).

2 голосов
/ 13 января 2010

Вы можете использовать FOR XML PATH для создания списка через запятую. Смотрите, например, это сообщение в блоге :

SELECT P.Name + ','
FROM Production.Product AS P
ORDER BY P.Name
FOR XML PATH('')
1 голос
/ 13 января 2010

Другим вариантом является использование CLR. Вы можете создать собственный пользовательский агрегат, написанный на c # или VB.Net, который будет возвращать список через запятую (который затем будет использоваться точно , как если бы вы использовали SUM или COUNT ).

См. эту страницу и эту страницу , чтобы начать работу.

1 голос
/ 13 января 2010

выглядит хорошо для меня. В прошлом я делал подобные вещи и нашел трюк COALESCE самым простым способом сделать это.

Это часто используемая функция, которую трудно найти, если вы не знаете, что ищете, поэтому вот хорошая статья, в которой подробно описывается, как это сделать: http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...