Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2010, 17:26   #1
Машуля
Пользователь
 
Аватар для Машуля
 
Регистрация: 03.01.2008
Сообщений: 17
Подмигивание Запрос из нескольких таблиц (отношение многие-ко-многим)

Здравствуйте!

Есть база данных института (Microsoft SQL Server 2005)
Существуют две таблицы:
Groups{id, name} (группы)
Flows{id,name} (потоки)

Они связаны отношением многие-ко-многим (то есть один поток может содержать несколько групп, одна группа может принадлежать нескольким потокам), соответственно существует связующая таблица:
GroupFlow {id, gr_id,fl_id}

Нужно написать запрос, чтоб выходила следующая информация:
первое поле - flows.id (id потока)
второе поле - через запятую должны выводится Groups.Name (названия групп, принадлежащих этому потоку)

Как мне это реализовать?
Машуля вне форума Ответить с цитированием
Старый 25.03.2010, 18:36   #2
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Машуля Посмотреть сообщение
Здравствуйте!
Hello, Машуля!

Ну, наверное, как-то так:

Код:
SELECT Flows.id,
           Groups.name
   FROM GroupFlow
     LEFT JOIN Groups ON Groups.id = GroupFlow.gr_id
     LEFT JOIN Flows ON Flows.id = GroupFlow.fl_id
edgy вне форума Ответить с цитированием
Старый 25.03.2010, 20:02   #3
Машуля
Пользователь
 
Аватар для Машуля
 
Регистрация: 03.01.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от edgy Посмотреть сообщение
Hello, Машуля!

Ну, наверное, как-то так:

Код:
SELECT Flows.id,
           Groups.name
   FROM GroupFlow
     LEFT JOIN Groups ON Groups.id = GroupFlow.gr_id
     LEFT JOIN Flows ON Flows.id = GroupFlow.fl_id
Спасибо, edgy! Но мне хотелось не совсем этого. Допустим, в таблице Groups существуют записи:

id _________ name
-------------------
1 _________ ОРМПИ11
2 _________ ТЛК11
3 _________ ТВ11
4 _________ СТЖК 12
... ...

В таблице Flows :

id _________ name
-------------------
1 _________ Транспорт 1 курс
2 _________ Строители 1 курс

Таблица GroupFlow:

id_gr_kod _fl_kod
-------------------
1 ___ 1___ 1
2 ___ 2___ 1
3 ___ 2___ 2
4 ___ 3___ 2
5 ___ 4___ 2

В результате запроса хотелось бы видеть:

fl_id ___ groups
-------------------
1___ ОРМПИ11,ТЛК11
2 ___ ТЛК11,ТВ11,СТЖК12
Машуля вне форума Ответить с цитированием
Старый 25.03.2010, 21:12   #4
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Машуля Посмотреть сообщение
Но мне хотелось не совсем этого.
Прошу прощения - не внимательно прочитал ваше первое сообщение. Поэтому не верно понял суть проблемы.

Тогда так будет правильнее ( с учетом того что вы используете MS SQL Server 2005 ):

Код:
SELECT Flows.id,
      ( SELECT Groups.name + ',' as 'data()'
          FROM GroupFlow gf2
          LEFT JOIN Groups ON Groups.id = gf2.gr_id
          LEFT JOIN Flows ON Flows.id = gf2.fl_id
         WHERE gf1.fl_id = gf2.fl_id FOR XML path( '' ) )
FROM GroupFlow gf1
  LEFT JOIN Groups ON Groups.id = gf1.gr_id
   LEFT JOIN Flows ON Flows.id = gf1.fl_id
GROUP BY Flows.id, gf1.fl_id
edgy вне форума Ответить с цитированием
Старый 26.03.2010, 08:04   #5
Машуля
Пользователь
 
Аватар для Машуля
 
Регистрация: 03.01.2008
Сообщений: 17
По умолчанию

Спасибо за помощь, edgy! Запрос выдает именно то, что мне нужно.

Только после последней группы выдается запятая, вот так:

fl_id ___ groups
-------------------
1___ ОРМПИ11,ТЛК11,
2 ___ ТЛК11,ТВ11,СТЖК12,

По идее, этих запятых не должно быть.

Я не сильна в XML, а тем более в использовании его в SQL Server...
Машуля вне форума Ответить с цитированием
Старый 26.03.2010, 09:06   #6
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Машуля Посмотреть сообщение
По идее, этих запятых не должно быть.
Ну, если без последних запятых, то тогда так:

Код:
SELECT Flows.id,
      STUFF( ( SELECT ', ' + Groups.name
                     FROM GroupFlow gf2
                     LEFT JOIN Groups ON Groups.id = gf2.gr_id
                     LEFT JOIN Flows ON Flows.id = gf2.fl_id
                  WHERE gf1.fl_id = gf2.fl_id FOR XML path( '' ) ), 1, 2, '' )  AS   GroupName
FROM GroupFlow gf1
  LEFT JOIN Groups ON Groups.id = gf1.gr_id
  LEFT JOIN Flows ON Flows.id = gf1.fl_id
GROUP BY Flows.id, gf1.fl_id
Даже проверил - вроде то, что нужно
edgy вне форума Ответить с цитированием
Старый 28.03.2010, 09:51   #7
Машуля
Пользователь
 
Аватар для Машуля
 
Регистрация: 03.01.2008
Сообщений: 17
По умолчанию

Спаисбо, Edgy! Это то, что нужно! Буду изучать XML в SQL Server
Машуля вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос на выборку из нескольких таблиц bullvinkle Microsoft Office Access 9 11.04.2012 04:35
Создание связи многие ко многим в Delphi rockedit БД в Delphi 1 11.01.2011 15:10
Связь многие-ко-многим andirock2112 БД в Delphi 10 12.04.2009 22:05
Многие ко многим ("")(Э_Є)("") БД в Delphi 1 12.03.2009 01:18
Сведение нескольких таблиц в одну Sega Microsoft Office Excel 3 05.08.2008 15:21