ОБЪЕДИНЯЮТ лучший способ достигнуть этого?

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

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

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

Я хочу связать эти два столбца в столбце под названием Имя в то же время, что и, беря каждую строку для 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

То, что я действительно должен знать, - прежде чем я запущу вниз, путь с ОБЪЕДИНЯЮТ и пытаются вертеться, моими результатами является там лучший способ выполнить это? Использование SQL Server 2005.

Удачи,

Mike

5
задан Shannon Severance 13 January 2010 в 01:01
поделиться

5 ответов

Вот как вы это делаете с техникой 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
4
ответ дан 18 December 2019 в 14:46
поделиться

Я считаю, что все, что написано в предыдущих версиях SDK, полностью совместимы с последней версией.

Я уверен, что прочитал это в документации SDK, когда настраивал свою среду IDE.

Если я прав, то действительно нет необходимости обновлять ваше приложение, чтобы использовать добавленные функции, хотя опция всегда будет там, если вы решите расширить его.

-121--4180431-

Мне не нравится аргумент читаемости, когда он мешает людям использовать родной язык в именах пользователей.

Рекомендуется экспериментировать с использованием классов символов, включающих http://msdn.microsoft.com/en-us/library/20bw873z.aspx#SupportedUnicodeGeneralCategories или http://msdn.microsoft.com/en-us/library/20bw873z.aspx#SupportedNamedBlocks . Я не пробовал это, но

[\p{L}\p{N}\p{M}]

может стоить эксперимента.

-121--1604005-

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

Для начала см. на этой странице и на этой странице .

1
ответ дан 18 December 2019 в 14:46
поделиться

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

Моя любимая техника - это XML PATH (как Андомар уже опубликован).

3
ответ дан 18 December 2019 в 14:46
поделиться

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

SELECT P.Name + ','
FROM Production.Product AS P
ORDER BY P.Name
FOR XML PATH('')
3
ответ дан 18 December 2019 в 14:46
поделиться

Необходимо выполнить поиск в потоке, как и вы, затем вызвать DiscardBufferedData в StreamReader . Документация здесь :

Edit: Add code example:

Stream s = new MemoryStream();
StreamReader sr = new StreamReader(s);
// later... after we read stuff
s.Position = 0;
sr.DiscardBufferedData();        // reader now reading from position 0
-121--940879-

Middleware является предпочтительным способом выполнения подобных действий на основе «каждого запроса». Например, вот простой бит промежуточного программного обеспечения, чтобы добавить тот же самый (пример) заголовок P3P к каждому ответу Джанго генерирует:

В settings.py:

P3P_COMPACT = 'policyref="http://www.example.com/p3p.xml", CP="NON DSP COR CURa TIA"'
MIDDLEWARE_CLASSES += ('myapp.middleware.P3PHeaderMiddleware',)

В myapp/middleware.py:

from django.conf import settings

class P3PHeaderMiddleware(object):
    def process_response(self, request, response):
        response['P3P'] = getattr(settings, 'P3P_COMPACT', None)
        return response

Вы также можете получить аналогичный эффект в одном представлении, установив заголовок P3P в ответе:

def my_view(request):
    response = render_to_response('my_template.html')
    response['P3P'] = 'CP="NON DSP COR CURa TIA"'
    return response

Чтобы немного расширить тему, cookie и заголовки, такие как заголовок P3P, отправляются одновременно, как часть ответа; фактически, под колпаком печенье устанавливается с другим заголовком ответа. Вы можете увидеть заголовок cookie с помощью завиток:

$ curl --head http://www.google.com/
HTTP/1.1 200 OK
Date: Wed, 13 Jan 2010 00:04:59 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=d2c09762c479f94e:TM=1263341099:LM=1263341099:S=oJby3NpU4RsRfuYa; expires=Fri, 13-Jan-2012 00:04:59 GMT; path=/; domain=.google.com
Set-Cookie: NID=30=kdKrd5e-u6Xs7cUe3p4eaNDtv6SO88uBL5v6_M1XMTSRmkh7okxrWLOm-l_uZdN37PxQIe4dBlekFFVCpTFXGyIDlUrz1hEwhgVLvXfIik_VeVWGmWzKbA5qu_Zq0sOi; expires=Thu, 15-Jul-2010 00:04:59 GMT; path=/; domain=.google.com; HttpOnly
Server: gws
X-XSS-Protection: 0
Transfer-Encoding: chunked
-121--2477039-

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

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

2
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: