Russian Qt Forum

Программирование => Базы данных => Тема начата: Danila_Bagrofff от Апрель 25, 2011, 09:54



Название: Запрос объединяющий ключевое поле и несколько строк в другой таблице
Отправлено: Danila_Bagrofff от Апрель 25, 2011, 09:54
Можно ли получить как-либо запрос, который объединит в одной строке следующие параметры.
есть 2 таблицы.
В первой таблице описания объектов objects:
idObj nameObj typeObj stateObj

Есть 2 таблица attributes с атрибутами объектов, связь идет c объектами по idObj.
idObj typeAttr Attr

Хотелось бы как-то сделать запрос, в котором объединились в одной строке:
idObj nameObj typeObj stateObj и дальше перечисление всех Attr.
То есть сразу видеть все параметры данного объекта.

Возможно ли сделать такой запрос? Сам ответа не нашел...


Название: Re: Запрос объединяющий ключевое поле и несколько строк в другой таблице
Отправлено: Пантер от Апрель 25, 2011, 09:56
man join


Название: Re: Запрос объединяющий ключевое поле и несколько строк в другой таблице
Отправлено: Danila_Bagrofff от Апрель 25, 2011, 12:40
нет, join'а недостаточно..

смотри
1 таблица, objects
idObj nameObj typeObj stateObj
1      Объект1     Тип1    Сост1
2      Объект2     Тип2     Сост2

2 таблица, attributes
idObj typeAttr Attr
1       типА1    123
1       типА2     321
1       типА3    324
2       типА1    565
2       типА3    456

Запрос вида
select idObj, nameObj, typeObj, stateObj, Attr
from objects join attributes  on attributes.idObj  = objects.idObj
where objects.idObj = 1

Нам даст 3 строчки
1      Объект1     Тип1    Сост1 123
1      Объект1     Тип1    Сост1 321
1      Объект1     Тип1    Сост1 324

А я хотел бы увидеть одну такого вида:
1      Объект1     Тип1    Сост1 123  321  324

Вот как состряпать такое.. никак не разумею..


Название: Re: Запрос объединяющий ключевое поле и несколько строк в другой таблице
Отправлено: Пантер от Апрель 25, 2011, 12:52
На сколько я помню, так не получится сделать.


Название: Re: Запрос объединяющий ключевое поле и несколько строк в другой таблице
Отправлено: asvil от Апрель 25, 2011, 12:53
Так это же чистой воды агрегация. Если Вы счастливый обладатель Postgresql, то сделайте примерно
Код:
select idObj, nameObj, typeObj, stateObj, array_agg(Attr)
from objects join attributes  on attributes.idObj  = objects.idObj
group by nameObj, typeObj
having objects.idObj = 1

Иначе всматривайтесь в агрегирующие в массивы функции в Вашей СУБД


Название: Re: Запрос объединяющий ключевое поле и несколько строк в другой таблице
Отправлено: MoPDoBoPoT от Апрель 25, 2011, 21:28
Если нет возможности решить стандартными средствами СУБД (как продемонстрировал Михаил), то можно воспользоваться самописной хранимой функцией, которая на вход получает "idObj", а возвращает сцепленные строки "Attr" для данного объекта.


Название: Re: Запрос объединяющий ключевое поле и несколько строк в другой таблице
Отправлено: vlad-mal от Май 24, 2011, 06:23
В FireBird, к примеру, есть агрегатная функция List, которая формирует список значений с разделителями (например, через запятую).