powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь многие ко многим и проблемы с выборкой на SQL
25 сообщений из 48, страница 1 из 2
Связь многие ко многим и проблемы с выборкой на SQL
    #35354358
Durilka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите написать SQL-запрос в следующей ситуации:

Есть три таблицы:
первая: КНИГИ(КодКниги, Название)
вторая: АВТОРЫ(КодАвтора, ФИО)
третья: АВТОРЫ_КНИГИ(КодКниги, КодАвтора) – эта таблица по сути реализует связь многие-ко-многим между таблицами КНИГИ и АВТОРЫ.
Книга может иметь одного, двух и т.д. авторов,
Любой автор может написать одну, две и более книг.
Требуется написать SQL-запрос, который возвращал бы два столбца: первый – название книги, второй – авторы через запятую, например,

Книга1 Иванов И.И., Петров П.П.
Книга2 Иванов И.И.
Книга3 Иванов И.И., Петров П.П., Сидоров С.С.

Использовать ANSI SQL.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35354380
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполнять его планируется на ANSI СУБД? В таком случае, можно взять описание стандарта и посмотреть, какие в нем предусмотрены агрегатные функции для строк...
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35354887
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Durilka пишет:

> первая: КНИГИ(КодКниги, Название)
> вторая: АВТОРЫ(КодАвтора, ФИО)
> третья: АВТОРЫ_КНИГИ(КодКниги, КодАвтора) – эта таблица по сути
> реализует связь многие-ко-многим между таблицами КНИГИ и АВТОРЫ.
> Книга может иметь одного, двух и т.д. авторов,
> Любой автор может написать одну, две и более книг.
> Требуется написать SQL-запрос, который возвращал бы два столбца: первый
> – название книги, второй – авторы через запятую, например,

Такой запрос НЕ НУЖНО писать на SQL.
Результат запроса нарушает 1НФ
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355327
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычно такие вещи делаются рекурсивными запросами - это обычно дело.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355361
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТакой запрос НЕ НУЖНО писать на SQL.
Результат запроса нарушает 1НФ
Что-то Вы в последнее время сыпете оригинальными идеями....
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355382
Durilka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточняю постановку задачи. Имеется таблица в которой пользователь хранит информацию о книгах:
КНИГИ(КодКниги, Название, Авторы)

Приведём, например, три строки из этой таблицы:
1 Книга1 Иванов И.И., Петров П.П.
2 Книга2 Иванов И.И.
3 Книга3 Иванов И.И., Петров П.П., Сидоров С.С.

Очевидно, что приведенная выше таблица не удовлетворяет определению 1НФ, т. к. третий столбец не является атомарным и содержит повторяющуюся группу атрибутов.

Для приведения к первой нормальной форме эта группа была выделена в отдельное отношение АВТОРЫ(КодАвтора, ФИО). В отношении КНИГИ остались атрибуты (КодКниги, Название). Между отношениями КНИГИ и АВТОРЫ существует связь многие-ко-многим. Для её разрешения было введено отношение АВТОРЫКНИГИ(КодКниги, КодАвтора).

В результате приведенные в таблице выше данные оказались в трёх нормализованных отношениях:

отношение КНИГИ(КодКниги, Название) содержит данные:
1 Книга1
2 Книга2
3 Книга3
Ключ этого отношения – атрибут КодКниги.

отношение АВТОРЫ(КодАвтора, ФИО) содержит данные:
1 Иванов И.И.
2 Петров П.П.
3 Сидоров С.С.
Ключ этого отношения – атрибут КодАвтора.


отношение АВТОРЫКНИГИ(КодКниги, КодАвтора) содержит данные:
1 1
1 2
2 1
3 1
3 2
3 3
Ключ этого отношения составной – атрибуты (КодКниги, КодАвтора).

Т.е. были построены три нормализованных отношения для хранения данных в базе данных. Но для отчёта пользователю нужно из этой базы данных извлечь данные соответствующие первоначальной таблице. Как используя SQL-92 получить такую таблицу из трёх нормализованных отношений?

Результат выполнения SQL-запроса может быть таблицей, не являющейся отношением (т.е. результат может не удовлетворять даже определению 1НФ). Вопрос в том, как пользуясь SQL-92 фактически восстановить ту ненормализованную таблицу, которая была изначально, так как именно она нужна пользователю.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355396
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman пишет:

> обычно такие вещи делаются рекурсивными запросами - это обычно дело.
Это-то здесь при чем ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355397
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Durilka пишет:

> Использовать ANSI SQL.
кстати, вы должны понимать, что "ANSI SQL" и "будет работать на любой СУБД,
поддерживающей ANSI SQL" -- это далеко не одно и то же.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355401
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer пишет:

> Что-то Вы в последнее время сыпете оригинальными идеями....

А мне в последнее время очень надоело объяснять людям, что белое -
это белое, а чёрное - это чёрное. И надоело тратить свое время
на объяснение элементарных вещей людям, их не понимающим.
Отсюда и краткость формы, и видимая категоричность заявления.
Но вместе с тем, надеюсь, мысль должна быть понятна.

Если вы хотите со мной поспорить о том, надо ли что-то в наборах
данных выводить через запятую, я от спора уклонюсь, ей богу.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355413
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Durilka пишет:

Вы все хорошо сделали, сделайте и еще лучше. ...

Но для отчёта пользователю нужно из этой базы данных
> извлечь данные соответствующие первоначальной таблице. Как используя
> SQL-92 получить такую таблицу из трёх нормализованных отношений?

Это надо делать на клиенте. В отчетниках например очень легко
сделать из подряд идущий записей одной книги группу, в заголовке
которой выводить все атрибуты книги, а в detail-е группы - авторов,
по одному на строке. Или применять контатенирующие группирующие функции.
В некоторых средствах вообще не проблема вывести это вместе, как, например, в
XML/XSLT это очень просто делается.

> Вопрос в том, как пользуясь SQL-92 фактически восстановить ту
> ненормализованную таблицу, которая была изначально, так как именно она
> нужна пользователю.

Это - очень общирный вопрос, очень часто обсуждаемый во всяких фомумах,
FAQ и так далее. в частности можете посмотреть это :

http://www.sql.ru/faq/faq_topic.aspx?fid=130

http://www.sqlserverfaq.com/controls/kbase/store/neilfaq/crosstab.txt

Или поищите сами что-то типа field concatenate или crosstab in SQL.

вы найдете кучу решений и с десяток вариантов, каждый из которых
имеет свою особенность и т.п. Плюс помножте это на кол-во основных
СУБД. Но не один из них не будет универсальным и подходящим во всех
случаях жизни. Потому что эта задача на SQL в общем виде не решается.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355426
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто надо делать на клиенте. В отчетниках например очень легко сделать из подряд идущий записей одной книги группу,
.. побочным эффектом будет удесятерение количества "почти одинаковых строк", выкачиваемых с сервера, ну или джойн тоже будем делать на клиенте.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355805
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DurilkaПомогите написать SQL-запрос в следующей ситуации:
...
Использовать ANSI SQL.
...
Как используя SQL-92 ...
Чисто ради интереса, безотносительно данного запроса - а почему ANSI SQL 92?
В частности, как вы собираетесь проверять, что это строго ANSI SQL 92?
Уже много лет никто не занимается проверкой реальных СУБД на их соответсвие стандарту-
все на совести производителей.

2 MasterZiv
>Результат запроса нарушает 1НФ
Это несомненно сгоряча....
Но на всякий случай - где запросы и где проблемы обновления, с которыми НФ воюют.

2 softwarer
Действительно есть идея как агрегировать строки в рамках ANSI SQL 92?
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355825
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRДействительно есть идея как агрегировать строки в рамках ANSI SQL 92?
Я предпочитаю руководствоваться идеей "настучать по голове тому, кто в силу дурацких соображений собирается ограничиться стандартом".
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35355977
нектотам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Такой запрос НЕ НУЖНО писать на SQL.
Результат запроса нарушает 1НФ

НФ определены на множествах отношений, а не для результатов SELECT. "SELECT a FROM b" в общем случае даже не отношение (т.к. значения a могут повторяться). И пользователи обычно хотят видеть не отношения, а отчеты.

ЗЫ: насколько я знаю, в чистом SQL-92 эта задача не решается.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35356093
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нектотам пишет:

> НФ определены на множествах отношений, а не для результатов SELECT.
> "SELECT a FROM b" в общем случае даже не отношение (т.к. значения a
> могут повторяться). И пользователи обычно хотят видеть не отношения, а
> отчеты.

Это верно, безусловно. Но язык SQL не предназначен для обработки
как таблиц, так и view и даже наборов данных, не находящихся в 1НФ.
Ну и, в частности, он не умеет их генерировать.
Есть только расширения конкретных СУБД, позволяющие это делать
(я знаю только group_concat в MySQL).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35356112
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer пишет:

> .. побочным эффектом будет удесятерение количества "почти одинаковых
> строк", выкачиваемых с сервера, ну или джойн тоже будем делать на клиенте.

да, будет.
но
0) Авторов у книги все же не миллион.
1) если их все же много, то они ни в какую строчку СУБД (поле набора
данных) не влезут. Врядли СУБД будет формировать это поле в виде
BLOB/CLOB.
2) если их все-таки очень много, их надо делать master/detail, да, на
клиенте, а как еще ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35356117
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто верно, безусловно. Но язык SQL не предназначен для обработки
как таблиц, так и view и даже наборов данных, не находящихся в 1НФ.И что, даже SELECT нельзя из такой таблицы сделать? :)

Вы, кажется, путаете "нормально обрабатывать" и "обрабатывать с извращениями".
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35356208
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Durilka
Видел решения этой задачи на различных платформах,
сложнее всего она решается в JET (MS Access).
Решения есть на форуме.
Если еще актуально - могу поискать и ткнуть носом:).
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35357089
Durilka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexmsp2Durilka
Видел решения этой задачи на различных платформах,
сложнее всего она решается в JET (MS Access).
Решения есть на форуме.
Если еще актуально - могу поискать и ткнуть носом:).


Если действительно есть такое решение, то пожалуйста, не тыкайте меня носом :(, а просто оставьте ссылку :). Буду благодарен.

Суть вопроса в том, что если процесс нормализации преобразовал исходную таблицу в набор нормализованных отношений, то возможно ли получить исходную таблицу используя стандарт языка множеств и не пользуясь теми особенностями фактически процедурных языков, которые введены в SQL коммерческих СУБД.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35357153
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexmspЕсли еще актуально - могу поискать и ткнуть носом:).Поищите...
Желательно, чтобы там еще все было на ANSI SQL.
Есть большие сомнения, что сможете найти.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35359331
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely
Желательно, чтобы там еще все было на ANSI SQL.


На ANSI SQL не знаю (не видел такой агрегатной ф-ции), а решения есть здесь:

http://www.sql.ru/faq/faq_topic.aspx?fid=130
/topic/481834&hl=%ef%ee%ea%e0%e6%e8%f2%e5#4771761
http://hiprog.com/index.php?option=com_content&task=view&id=334&Itemid=35
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35359642
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexmspНа ANSI SQL не знаю (не видел такой агрегатной ф-ции), а решения есть здесь:В том-то и дело, что на разных SQL серверах решения этой задачи есть, вот только все они ни разу не на ANSI SQL.

Поэтому согласен с
softwarerЯ предпочитаю руководствоваться идеей "настучать по голове тому, кто в силу дурацких соображений собирается ограничиться стандартом".
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35363109
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA 9+
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select КНИГИ.Название,
list(АВТОРЫ.ФИО, ', ' order by АВТОРЫ.ФИО)
from КНИГИ,
АВТОРЫ,
АВТОРЫ_КНИГИ
where (КНИГИ.КодКниги = АВТОРЫ_КНИГИ.КодКниги) and
(АВТОРЫ.КодАвтора = АВТОРЫ_КНИГИ.КодАвтора)
group by КНИГИ.Название
Правда, к ANSI SQL это не имеет отношения, но кого волнует чужое горе .
____________________________________
- Гарфилд, мышь!
- Спасибо, я сыт.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35363823
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000ASA 9+
Код: plaintext
1.
list(АВТОРЫ.ФИО, ', ' order by АВТОРЫ.ФИО)

Остальным серверам БД и джету надо с этого брать пример.
Весьма полезная агрегатная функция для отчетов.
...
Рейтинг: 0 / 0
Связь многие ко многим и проблемы с выборкой на SQL
    #35366942
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GROUP_CONCAT в MySQL - аналог list в ASA 9
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь многие ко многим и проблемы с выборкой на SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]