Вывод нескольких строк в одну

Автор marat, 26 августа 2016, 16:47

0 Пользователи и 1 гость просматривают эту тему.

marat

В БД (встроенная HSQLDB) имеются три таблицы:

BOOKS, содержащая названия книг, например

IDTITLE
1Название 1
2Название 2

AUTHORS, содержащая имена авторов

IDNAMESURNAME
1ВасяПупкин
2ПасяВупкин

и таблица сопставления авторов и книг BOOK_AUTH, в которой к каждой книге можно привязать множество авторов

IDBOOK_IDAUTH_ID
121
222

Задача написать запрос, в результате которого в первом столбце выводилась бы книга, а во втором авторы через запятую, вот так:

BOOKAUTHORS
Название 2Вася Пупкин, Пася Вупкин

В MySQL подобное делается с помощью GROUP_CONCAT, но во встроенной версии HSQLDB такое, как я понял, не поддерживается. Подскажите, как можно решить эту задачу? К сожалению, кроме варианта с использованием более новой версии HSQLDB, как внешней ничего не нашел. Вариант с использованием внешней таблицы не подходит, поскольку выбирал встроенную из-за того что ее можно перенести на другую машину, не заморачиваясь с разворачиванием сервера баз данных.

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


economist

Здесь нужно использовать LEFT OUTER JOIN, только он даст

Название 2   Вася Пупкин
Название 2   Пася Вупкин

Также можно вложенны запрос
SELECT ..., (SELECT...) FROM...

А вообще, чтобы "не заморачиваясь с разворачиванием сервера баз данных" - используйте
однофайловую безсерверную сверхнадежную СУБД SQLite с SQLite ODBC Driver под Windows или Linux.

Движок HSQLDB - непригоден даже для обучения, потому как имеет жуткие странности. Не буду их перечислять. HSQLDB оказался очень требователен к явной группировке для агрегирующих функций - нужно упомянуть все(!) столбцы, SELECT-запросы в нем очень "многословны".

Кстати, в Base есть еще один встроенный движок - FireBird!
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

kompilainenn

Цитата: economist от 26 августа 2016, 19:52Кстати, в Base есть еще один встроенный движок - FireBird!
который еще не допилен, будьте внимательны и осторожны! в ЛО 5.3 его еще и апнули до FB 3.0, что нарушило обратную совместимость с уже имеющимися базами на этом движке
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

rami

Цитата: marat от 26 августа 2016, 14:47В MySQL подобное делается с помощью GROUP_CONCAT, но во встроенной версии HSQLDB такое, как я понял, не поддерживается.
В документации Aggregate Functions вроде бы можно, но у меня не получается :(

marat

Всем спасибо за ответы.
Такой запрос нужен был мне для создания представления и последующего экспорта его в ODS, поэтому я пошел по легкому пути и через тот же LO Base подключился к MySQL, который уже был развернут на моем ПК, экспортировал туда таблицы (благо это легко делается путем перетаскивания таблиц из одного окна в другое) и все дальнейшие действия проводил уже там. Заодно непроизвольно создал резервную копию базы  ;D

Придется людям которым нужна база передавать базу с HSQLDB, а тем кому нужен ODS с конкатенацией строк формировать его из MySQL  :roll:

Цитата: economist от 26 августа 2016, 21:52
А вообще, чтобы "не заморачиваясь с разворачиванием сервера баз данных" - используйте
однофайловую безсерверную сверхнадежную СУБД SQLite с SQLite ODBC Driver под Windows или Linux.

Если не ошибаюсь в SQLite были какие-то проблемы с юникодом.

Цитата: economist от 26 августа 2016, 21:52
Кстати, в Base есть еще один встроенный движок - FireBird!

Цитата: kompilainenn от 26 августа 2016, 22:14
который еще не допилен, будьте внимательны и осторожны! в ЛО 5.3 его еще и апнули до FB 3.0, что нарушило обратную совместимость с уже имеющимися базами на этом движке

У меня в ЛО 5.1 его нет, по крайней мере в списке выбора встроенной базы, но его появление уже радует ибо там есть функция LIST, которой мне сейчас как раз так не хватает (в 3.0 уж точно), из-за отстуствия которой и была создана эта тема. Но видимо до выхода LO 5.3 особо сильно рассчитывать на это не стоит.

Цитата: rami от 27 августа 2016, 19:56
В документации Aggregate Functions вроде бы можно, но у меня не получается :(

Это документация для HSQLDB 2.3.4, а в LO встроен 1.8.Х

economist

marat -

1) SQLite3 не имеет никаких проблем с юникодом, все хранится как юникод-текст, типизация "утиная".
Использую 5 лет SQLite в режиме "файлового сервера" т.е. с одновременным доступом по сети 3-5 человек, причем как из OO и LO, так и напрямую.
Одновременно читают до 10 клиентов. Скорость НАИВЫСШАЯ из всех СУБД, которые пробовал (а это почти все известные).

2) У вас в ЛО 5.1 FireBird есть. Просто нужно включить Сервис-Параметры-Расшироенные...Включить Экспериментальные...

3) Заменить HSQLDB на 234 можно простым копированием нужных JAR-файлов. Но повторюсь - этот движок, имхо, неюзабелен. Жду когда сделают встроенной SQLite.  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

marat

#7
Цитата: economist от 27 августа 2016, 20:40
marat -

1) SQLite3 не имеет никаких проблем с юникодом, все хранится как юникод-текст, типизация "утиная".
Использую 5 лет SQLite в режиме "файлового сервера" т.е. с одновременным доступом по сети 3-5 человек, причем как из OO и LO, так и напрямую.
Одновременно читают до 10 клиентов. Скорость НАИВЫСШАЯ из всех СУБД, которые пробовал (а это почти все известные).

Не поделитесь скрином с настройками ODBC на SQLite?
Попробовал подключиться к базе через JDBC от Xerial, выдает ошибку при загрузке таблицы SQLite only supports TYPE_FORWARD_ONLY cursors.
64 битный ODBC ругнулся на то, что LO 32-бит, а 32-битный ODBC что то не ставится. Попробую в ближайшее время поменять LO на 64 битный.

marat

#8
Цитата: economist от 27 августа 2016, 18:40Заменить HSQLDB на 234 можно простым копированием нужных JAR-файлов. Но повторюсь - этот движок, имхо, неюзабелен. Жду когда сделают встроенной SQLite.

Если обновить движок, то впринципе все функции 234 работают нормально, ровно до того как вы закроете базу. При попытке открыть базу снова - вылезет ошибка "Невозможно установить соединение. База данных создана более новой версией LibreOffice".

Как вариант можно конечно сделать копию базы, через Сервис -> Параметры -> LibreOffice -> Расширенные возможности -> Путь класса добавить новый hsqldb.jar, выполнить запрос, экспортировать его результат, а потом удалить из путей класса hsqldb.jar от 2.3.4 и дальше работать с первоначальной БД. БД, которая была открыта со включенным hsqldb.jar от версии 2.3.4 приходит в негодность сразу после её закрытия.

economist

marat - забудьте про 64-разрядные версии OpenOffice и LibreOffice и драйверов ODBC для них - всё должно быть только 32-х разрядным, даже под Windows 32/64-bit! Тем более что все прекрасно работает. Sqlite ODBC - это ch-werner.de

Никаких настроек драйвера ODBC в OpenOffice и LibreOffice нет, а в Администраторе - есть, скрин прилагаю:

Обратите внимание на флаг OEMCP - без него Таблицы/Поля на кириллице просто "пропадут", хотя физически не повредятся...
Также важен параметр Lock TimeOut - файл БД при операциях записи по LAN будет залочен для чтения на 10000 мсек. На практике достаточно и 3000 мсек, но это исходя из ваших условий и частоты записи.     
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Интересна также возможность указать Load Extention - модули расширения. В частности, если нужен регистронезависимый Like в SQL, корректный Upper/Lower или польз. функции - здесь можно перечислить нужные dll-ки.

Все больше функционала из расширений перекочевывает в ядро SQLite. Вот скоро ODBC-драйвер получит SQLite версии 3.14 и появится CSV-модуль, после чего MS Access станет ненужным чуть более чем абсолютно. Пока "линковка" CSV в SQLite возможна только через расширение.   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...