|
|
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
Помогите написать SQL-запрос в следующей ситуации: Есть три таблицы: первая: КНИГИ(КодКниги, Название) вторая: АВТОРЫ(КодАвтора, ФИО) третья: АВТОРЫ_КНИГИ(КодКниги, КодАвтора) – эта таблица по сути реализует связь многие-ко-многим между таблицами КНИГИ и АВТОРЫ. Книга может иметь одного, двух и т.д. авторов, Любой автор может написать одну, две и более книг. Требуется написать SQL-запрос, который возвращал бы два столбца: первый – название книги, второй – авторы через запятую, например, Книга1 Иванов И.И., Петров П.П. Книга2 Иванов И.И. Книга3 Иванов И.И., Петров П.П., Сидоров С.С. Использовать ANSI SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 15:37 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
Выполнять его планируется на ANSI СУБД? В таком случае, можно взять описание стандарта и посмотреть, какие в нем предусмотрены агрегатные функции для строк... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 15:44 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
Durilka пишет: > первая: КНИГИ(КодКниги, Название) > вторая: АВТОРЫ(КодАвтора, ФИО) > третья: АВТОРЫ_КНИГИ(КодКниги, КодАвтора) – эта таблица по сути > реализует связь многие-ко-многим между таблицами КНИГИ и АВТОРЫ. > Книга может иметь одного, двух и т.д. авторов, > Любой автор может написать одну, две и более книг. > Требуется написать SQL-запрос, который возвращал бы два столбца: первый > – название книги, второй – авторы через запятую, например, Такой запрос НЕ НУЖНО писать на SQL. Результат запроса нарушает 1НФ Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 18:18 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
обычно такие вещи делаются рекурсивными запросами - это обычно дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 23:35 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
MasterZivТакой запрос НЕ НУЖНО писать на SQL. Результат запроса нарушает 1НФ Что-то Вы в последнее время сыпете оригинальными идеями.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 00:15 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
Уточняю постановку задачи. Имеется таблица в которой пользователь хранит информацию о книгах: КНИГИ(КодКниги, Название, Авторы) Приведём, например, три строки из этой таблицы: 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 фактически восстановить ту ненормализованную таблицу, которая была изначально, так как именно она нужна пользователю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 00:39 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
gardenman пишет: > обычно такие вещи делаются рекурсивными запросами - это обычно дело. Это-то здесь при чем ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 00:57 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
Durilka пишет: > Использовать ANSI SQL. кстати, вы должны понимать, что "ANSI SQL" и "будет работать на любой СУБД, поддерживающей ANSI SQL" -- это далеко не одно и то же. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 00:58 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
softwarer пишет: > Что-то Вы в последнее время сыпете оригинальными идеями.... А мне в последнее время очень надоело объяснять людям, что белое - это белое, а чёрное - это чёрное. И надоело тратить свое время на объяснение элементарных вещей людям, их не понимающим. Отсюда и краткость формы, и видимая категоричность заявления. Но вместе с тем, надеюсь, мысль должна быть понятна. Если вы хотите со мной поспорить о том, надо ли что-то в наборах данных выводить через запятую, я от спора уклонюсь, ей богу. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 01:03 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 01:21 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
MasterZivЭто надо делать на клиенте. В отчетниках например очень легко сделать из подряд идущий записей одной книги группу, .. побочным эффектом будет удесятерение количества "почти одинаковых строк", выкачиваемых с сервера, ну или джойн тоже будем делать на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 01:56 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
DurilkaПомогите написать SQL-запрос в следующей ситуации: ... Использовать ANSI SQL. ... Как используя SQL-92 ... Чисто ради интереса, безотносительно данного запроса - а почему ANSI SQL 92? В частности, как вы собираетесь проверять, что это строго ANSI SQL 92? Уже много лет никто не занимается проверкой реальных СУБД на их соответсвие стандарту- все на совести производителей. 2 MasterZiv >Результат запроса нарушает 1НФ Это несомненно сгоряча.... Но на всякий случай - где запросы и где проблемы обновления, с которыми НФ воюют. 2 softwarer Действительно есть идея как агрегировать строки в рамках ANSI SQL 92? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 10:35 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
ModelRДействительно есть идея как агрегировать строки в рамках ANSI SQL 92? Я предпочитаю руководствоваться идеей "настучать по голове тому, кто в силу дурацких соображений собирается ограничиться стандартом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 10:40 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
MasterZiv Такой запрос НЕ НУЖНО писать на SQL. Результат запроса нарушает 1НФ НФ определены на множествах отношений, а не для результатов SELECT. "SELECT a FROM b" в общем случае даже не отношение (т.к. значения a могут повторяться). И пользователи обычно хотят видеть не отношения, а отчеты. ЗЫ: насколько я знаю, в чистом SQL-92 эта задача не решается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 11:38 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
нектотам пишет: > НФ определены на множествах отношений, а не для результатов SELECT. > "SELECT a FROM b" в общем случае даже не отношение (т.к. значения a > могут повторяться). И пользователи обычно хотят видеть не отношения, а > отчеты. Это верно, безусловно. Но язык SQL не предназначен для обработки как таблиц, так и view и даже наборов данных, не находящихся в 1НФ. Ну и, в частности, он не умеет их генерировать. Есть только расширения конкретных СУБД, позволяющие это делать (я знаю только group_concat в MySQL). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 12:06 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
softwarer пишет: > .. побочным эффектом будет удесятерение количества "почти одинаковых > строк", выкачиваемых с сервера, ну или джойн тоже будем делать на клиенте. да, будет. но 0) Авторов у книги все же не миллион. 1) если их все же много, то они ни в какую строчку СУБД (поле набора данных) не влезут. Врядли СУБД будет формировать это поле в виде BLOB/CLOB. 2) если их все-таки очень много, их надо делать master/detail, да, на клиенте, а как еще ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 12:09 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
MasterZivЭто верно, безусловно. Но язык SQL не предназначен для обработки как таблиц, так и view и даже наборов данных, не находящихся в 1НФ.И что, даже SELECT нельзя из такой таблицы сделать? :) Вы, кажется, путаете "нормально обрабатывать" и "обрабатывать с извращениями". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 12:10 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
2Durilka Видел решения этой задачи на различных платформах, сложнее всего она решается в JET (MS Access). Решения есть на форуме. Если еще актуально - могу поискать и ткнуть носом:). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 12:32 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
alexmsp2Durilka Видел решения этой задачи на различных платформах, сложнее всего она решается в JET (MS Access). Решения есть на форуме. Если еще актуально - могу поискать и ткнуть носом:). Если действительно есть такое решение, то пожалуйста, не тыкайте меня носом :(, а просто оставьте ссылку :). Буду благодарен. Суть вопроса в том, что если процесс нормализации преобразовал исходную таблицу в набор нормализованных отношений, то возможно ли получить исходную таблицу используя стандарт языка множеств и не пользуясь теми особенностями фактически процедурных языков, которые введены в SQL коммерческих СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 15:48 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
alexmspЕсли еще актуально - могу поискать и ткнуть носом:).Поищите... Желательно, чтобы там еще все было на ANSI SQL. Есть большие сомнения, что сможете найти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2008, 16:05 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2008, 13:49 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
alexmspНа ANSI SQL не знаю (не видел такой агрегатной ф-ции), а решения есть здесь:В том-то и дело, что на разных SQL серверах решения этой задачи есть, вот только все они ни разу не на ANSI SQL. Поэтому согласен с softwarerЯ предпочитаю руководствоваться идеей "настучать по голове тому, кто в силу дурацких соображений собирается ограничиться стандартом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2008, 15:03 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
ASA 9+ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ____________________________________ - Гарфилд, мышь! - Спасибо, я сыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2008, 16:24 |
|
||
|
Связь многие ко многим и проблемы с выборкой на SQL
|
|||
|---|---|---|---|
|
#18+
Dim2000ASA 9+ Код: plaintext 1. Остальным серверам БД и джету надо с этого брать пример. Весьма полезная агрегатная функция для отчетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2008, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35356112&tid=1540955]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
171ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 284ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...