На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
  
> Склеить в строку , PostrgeSQL 9.3
    Есть проблемка, не знаю куда копать. Есть таблицы A и B:

    Таблица-A
    IdName
    1Один
    2Два
    3Три

    Таблица-B
    IdUser
    1Иванов
    1Петров
    1Сидоров
    3Смирнов

    В результате запроса нужно получить:
    IdNameUsers
    1ОдинИванов, Петров, Сидоров
    2Два
    2ТриСмирнов

    Вобщем вопрос - как "собирать" поле "Users"? Пока формирую на клиенте, но не нравится это, чую, что не по-фэншую :-?
      Посмотри агрегатные функции - возможно, string_agg како-то удастся совместить с группировкой по B.ID...
      В крайнем случае, используй её в коррелирующем подзапросе.
      Сообщение отредактировано: Akina -
        Цитата JoeUser @
        что не по-фэншую

        :yes:
        На один-два пойдет, а если для "один" наберет 1 000 000 Ивановых и Петровых?
        Потянет PostrgeSQL такую строчку?
        Сообщение отредактировано: Bas -
          Цитата Akina @
          Посмотри агрегатные функции - возможно, string_agg како-то удастся совместить с группировкой по B.ID...
          В крайнем случае, используй её в коррелирующем подзапросе.

          Огромное спасибо, все нормуль!

          Получилось вот так:
          ExpandedWrap disabled
            SELECT
              a."Id", a."Name", array_to_string(array_agg(b."User"), ', ') as "Users"
            FROM
              public."A" AS a
            LEFT JOIN
              public."B" AS b
              ON
                a."Id" = b."Id"
            GROUP BY
              a."Id"
            ORDER BY
              a."Id"
            Уж совсем чтобы для феншуя можешь ещё сортировку в группе добавить...
              Цитата Bas @
              На один-два пойдет, а если для "один" наберет 1 000 000 Ивановых и Петровых?
              Потянет PostrgeSQL такую строчку?


              Точно не помню, но на слуху цифра - максимальная длина строки в Постгрессе - 400Gb.
              Значит потянет. По моей БД и не близко не будет. Пользователей максимум -100-150.

              Добавлено
              Цитата Akina @
              Уж совсем чтобы для феншуя можешь ещё сортировку в группе добавить...


              Я знал что твое кунг-фу сильнее :P

              Релиз:
              ExpandedWrap disabled
                SELECT
                  a."Id", a."Name", array_to_string(array_agg(b."User" ORDER BY b."User"), ', ') as "Users"
                FROM
                  public."A" AS a
                LEFT JOIN
                  public."B" AS b
                  ON
                    a."Id" = b."Id"
                GROUP BY
                  a."Id"
                ORDER BY
                  a."Id"
                Bugfix! :D

                ...
                array_to_string(array_agg(DISTINCT b."User" ORDER BY b."User"), ', ') as "Users"
                ...
                  JoeUser
                  А откуда на таком запросе может вылезать дублирование? Неужели у тебя в левой таблице ID неуникален?
                    Цитата Akina @
                    Неужели у тебя в левой таблице ID неуникален?


                    Левая таблица (ну вощем Таблица-B) - сборная, формируется сложением запросов через UNION. Много дублей.
                    Сообщение отредактировано: JoeUser -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0345 ]   [ 15 queries used ]   [ Generated: 25.04.24, 16:47 GMT ]