Есть ли лучший способ сделать это объединение в SQL Server 2008? - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть следующий оператор SQL, который выполняет конкатенацию подзапроса. Если вы заметили, он использует FOR XML .., что ... ну ... да, я немного дрожу :: Я чувствую, что это какой-то запах кода.

Есть ли лучший способ сделать это с SQL Server 2008?

SELECT a.CityId AS LocationId, a.City,
     STUFF(
        (SELECT ', ' + x.County
         FROM [dbo].[CountiesView] x
            INNER JOIN [dbo].[CityCounties] y ON x.CountyId = y.CountyId
         WHERE y.CityId = a.CityId
         FOR XML PATH (''))
     , 1, 2, '')
FROM [dbo].[CitiesView] a
    where a.StateCode = 'NY'

Что делает этот код, так это перечисляя все города (и их округа) для штата Нью-Йорк. Поскольку город может существовать в одном или нескольких округах, я хочу СОЗДАТЬ названия округов ... в противном случае я получу по 1 строке города на округ (чего я не хочу).

Можно ли это изменить, лучше?

Я пытался использовать COALESCE, но безуспешно.

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

«Лучше» в глазах смотрящего. Я не видел лучшего способа сделать это в SQL Server 2005+, но я не искал усердно.

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

1 голос
/ 09 февраля 2011

Поскольку вас не волнует ORDER, вы можете использовать для этого пользовательский агрегат CLR. Он вполне может работать лучше, чем метод XML, и ваш нынешний подход не будет работать хорошо, если в каких-либо округах есть символ & (или < и >, но я думаю, это маловероятно!)

...