SQL Server 2014, эквивалентный GROUP_CONCAT()

Я использую SQL Server 2014. У меня есть таблица country и таблица city.

Таблица стран

   ID | Code
   ---+-------
   1  |  USA
   2  |  UK
   

Городской стол

   ID | Code  | CountryID
  ----+-------+------------
   1  |  JSN  |    1
   2  |  REH  |    2

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

CountryCity стол

CountryID | CityID
----------+-------
    1     |   2
    1     |   4
    2     |   3
    1     |   5
    2     |   6

Теперь я хочу использовать таблицу CountryCity

Я хочу сгруппировать все города по своей стране в одну строку или несколько столбцов, как показано ниже.

CountryID | CountryCode | CitiesCode
----------+-------------+-----------
    1           USA        JSN , NYC 

Я хочу использовать отображение в CountryCity и получить коды из таблицы country и city

Я пробовал ниже, но все равно возвращает его в разных строках

select
    cc.countryID,
    cc.countryCode,
    citiedCode = stuff((select ',' + c.code
                        from dbo.city c
                        where cc.cityID = c.id
                        for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '')
from 
    dbo.[CountryCity] cc
inner join 
    country on country.id = cc.countryid 
where 
    cc.statusid = 1 and country.statusid = 1

person Rahul    schedule 01.02.2021    source источник
comment
Пожалуйста, укажите версию сервера sql.   -  person Popeye    schedule 01.02.2021
comment
Я думаю, вы должны использовать countryID в своем подзапросе. предполагая, что в таблице city каждая строка соответствует countryID, что-то вроде cc.CountryID = c.CountryID   -  person T. Peter    schedule 01.02.2021
comment
STRING_AGG был добавлен в SQL Server 2017. Кстати, самая старая версия SQL Server, которая все еще находится в основной поддержке, — это SQL Server 2016. Почему вы используете SQL Server 2014?   -  person Panagiotis Kanavos    schedule 01.02.2021
comment
Что касается вашей текущей проблемы, вам все равно нужно сгруппировать строки перед вычислением агрегата. Метод XML агрегирует все результаты подзапроса, преобразовывая их в XML с пустым значением. имена тегов, но внешний запрос по-прежнему должен группировать данные   -  person Panagiotis Kanavos    schedule 01.02.2021
comment
CountryCity имеет отношение "многие к одному" к Country в вашем FROM. Почему бы вам не ожидать несколько строк? Если вы хотите агрегировать города, CountryCity также должен быть в вашей агрегации.   -  person Larnu    schedule 01.02.2021


Ответы (1)


Я думаю, вы путаетесь, потому что в таблице city есть посторонняя countryId. Просто игнорируйте это.

Если вам нужна одна строка для каждой страны, не выполняйте соединение во внешнем запросе. Выполните соединение во внутреннем запросе:

select co.countryID, co.countryCode,
       stuff((select ',' + c.code
              from dbo.city c join
                   countrycity cc
                   on cc.cityid = c.id
              where cc.countryid =  co.id
              for xml path(''), type
             ).value('.', 'nvarchar(max)'), 1, 1, ''
            ) as citiedCode
from country co;

В ваших примерных данных нет столбцов statusid, поэтому я удалил эту логику. Вы можете включить эту логику в соответствующее место в зависимости от таблицы.

person Gordon Linoff    schedule 01.02.2021