Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

24 Март 2017, 19:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Вывод нескольких строк в одну  (Прочитано 1004 раз)
0 Пользователей и 1 Гость смотрят эту тему.
marat
Новичок
*
Offline Offline

Сообщений: 8


« Стартовое сообщение: 26 Август 2016, 16:47 »

В БД (встроенная 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'ом также не совсем подходит, поскольку мне неизвестно максимальное количество авторов для каждой книги.
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 020


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 26 Август 2016, 17:00 »

Давайте образец базы.
Записан

economist
Старожил
****
Offline Offline

Сообщений: 448


« Ответ #2: 26 Август 2016, 21:52 »

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

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

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

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

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

Кстати, в Base есть еще один встроенный движок - FireBird!
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
kompilainenn
Ветеран
*****
Online Online

Сообщений: 1 911



« Ответ #3: 26 Август 2016, 22:14 »

Кстати, в Base есть еще один встроенный движок - FireBird!
который еще не допилен, будьте внимательны и осторожны! в ЛО 5.3 его еще и апнули до FB 3.0, что нарушило обратную совместимость с уже имеющимися базами на этом движке
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 020


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #4: 27 Август 2016, 19:56 »

В MySQL подобное делается с помощью GROUP_CONCAT, но во встроенной версии HSQLDB такое, как я понял, не поддерживается.
В документации Aggregate Functions вроде бы можно, но у меня не получается Грустный
Записан

marat
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #5: 27 Август 2016, 20:01 »

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

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

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

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

Кстати, в Base есть еще один встроенный движок - FireBird!

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

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

В документации Aggregate Functions вроде бы можно, но у меня не получается Грустный

Это документация для HSQLDB 2.3.4, а в LO встроен 1.8.Х
Записан
economist
Старожил
****
Offline Offline

Сообщений: 448


« Ответ #6: 27 Август 2016, 20:40 »

marat -

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

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
marat
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #7: 27 Август 2016, 22:42 »

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 битный.
« Последнее редактирование: 28 Август 2016, 00:15 от marat » Записан
marat
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #8: 28 Август 2016, 00:06 »

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

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

Как вариант можно конечно сделать копию базы, через Сервис -> Параметры -> LibreOffice -> Расширенные возможности -> Путь класса добавить новый hsqldb.jar, выполнить запрос, экспортировать его результат, а потом удалить из путей класса hsqldb.jar от 2.3.4 и дальше работать с первоначальной БД. БД, которая была открыта со включенным hsqldb.jar от версии 2.3.4 приходит в негодность сразу после её закрытия.
« Последнее редактирование: 28 Август 2016, 00:13 от marat » Записан
economist
Старожил
****
Offline Offline

Сообщений: 448


« Ответ #9: 29 Август 2016, 10:06 »

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

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

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


* SQLite ODBC Setting.jpg (50.63 Кб, 629x510 - просмотрено 12 раз.)
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
economist
Старожил
****
Offline Offline

Сообщений: 448


« Ответ #10: 29 Август 2016, 10:25 »

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!