Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 345
от 22.02.2008, 16:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 447, Экспертов: 48
В номере:Вопросов: 1, Ответов: 2

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 123529: Уважаемые эксперты, прошу вас объяснить мне на примере такое объединение как INNER (LEFT, RIGHT) JOIN. Собственно говоря при объединении двух таблиц все понятно. Мне же необходимо объединить 4 таблицы. И здесь становится непонятным для меня сама запи...

Вопрос № 123.529
Уважаемые эксперты, прошу вас объяснить мне на примере такое объединение как INNER (LEFT, RIGHT) JOIN. Собственно говоря при объединении двух таблиц все понятно. Мне же необходимо объединить 4 таблицы. И здесь становится непонятным для меня сама запись такого объединения. Я хотя и методом подбора, но нашел правильную запись такого объединения для моего примера, однако объяснить почему именно так не могу.
Вот пример:

SELECT <поля>
FROM (((Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name)
LEFT JOIN Personaltable ON Tvarunutable.domogospodarstvo=PersonalTable.domogospodarstvo)
LEFT JOIN Gosptable ON Tvarunutable.domogospodarstvo=GospTable.ID)
LEFT JOIN Relationstable ON Personaltable.relation=RelationsTable.ID
WHERE <условие>

У меня есть:
таблица с перечнем людей Personaltable, которые живут в хозяйствах
таблица с перечнем хозяйств Gosptable
таблица с перечнем животных Tvarunutable, которыми владеет хозяйство
таблица Dovidnyktvaruntable с перечнем видов животных (справочник)
таблица Relationstable с перечнем семейных отношений

Мне необходимо вывести следующую информацию:
Фамилия, имя человека, который проживает в хозяйстве (номер хозяйства), в каких семейных отношениях она к председателю хозяйства (сын, дочь...), и сколько в данном хозяйстве, например, коров. То есть:
№ хозяйства, фамилия, имя, семье отношения, вид скота, количество скота.

Вышеприведенный пример выводит данную информацию, однако я не могу объяснить почему именно так, а не иначе?
Объясните пожалуйста, как в этом примере происходит объединение. Какой таблицы с которой? Я знаю какое объединение мне необходимо, но я не могу его увидеть именно в этом примере.
Наведите, если можно, общую конструкцию объединения нескольких таблиц.
Работаю с базой MS Access, драйверы доступа в БД MS Jet 4.x

И еще одно. Прочитал, что операция объединения JOIN выполняется медленнее, чем обычное объединение с указыванием условия в WHERE. Так ли оно и насколько медленно?

Буду очень благодарным за конструктивный ответ.
Отправлен: 17.02.2008, 15:38
Вопрос задал: Bohdan Andriyetskyy (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Игорь Елизаров
Здравствуйте, Bohdan Andriyetskyy!
для начала надо представить себе структуру таблиц и их взаимосвязи, потом уже станет легко, например,
Gosptable клчевое поле GospID
животные Tvarunutable содержит свое ключевое поле и поле id хозяйста
люди содержит свой ид и связь с хозяйством
родственные отношения содержит свой ид и связь с таблицей людей

связи в запросе получатся следующие
люди - хозяйство
хозяйство - животные
животные - виды животных
родственники - люди

самая главная таблица - люди и с ней LEFT JOIN связываем остальные таблицы
ну а дальше

select (поля)
from personaltable
left join Relationstable ON Personaltable.relation=RelationsTable.ID
left join gosptable on personaltable.gosptableia = gosptable.id
left join tvaruntable on gosptable.id = tvaruntable.gosptableid

left join Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name

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

---------
Пользователь - тоже человек..
Ответ отправил: Игорь Елизаров (статус: Студент)
Ответ отправлен: 17.02.2008, 23:16
Оценка за ответ: 5
Комментарий оценки:
Благодарю Игорь Елизаров, структура базы немножко отличается. Собственно главной таблицей у меня является Gosptable. Синтаксис запроса для SQL MS Jet несколько другой (нужно использовать дужки). Так или иначе, благодарю вас за ответ.

Отвечает: din
Здравствуйте, Bohdan Andriyetskyy!
Существует два вида соединения при помощи оператора JOIN, это:
INNER JOIN (внутренне соединение)— в этом случае будут выбраны только те записи из таблиц, которые удовлетворяют условию стоящему после ключевого слова ON;
OUTER JOIN (внешнее соединение) — при использовании данного типа соединения будут выбраны все строки той или иной таблицы. Все записи какой из таблиц выводить задается с помощью слов LEFT или RIGHT. Если указывать просто оператор JOIN, то будет сделано внутреннее соединение. Если указано хотя бы одно из ключевых LEFT или RIGHT, то будет сделано внешнее соединение.
Когда в запросе соединяются более 2 таблиц выборка происходит следующим образом, покажем на Вашем примере:

SELECT <поля>
FROM (((Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name)
LEFT JOIN Personaltable ON Tvarunutable.domogospodar stvo=PersonalTable.domogospodarstvo)
LEFT JOIN Gosptable ON Tvarunutable.domogospodarstvo=GospTable.ID)
LEFT JOIN Relationstable ON Personaltable.relation=RelationsTable.ID
WHERE <условие>


Соединение у нас внешнее, первая строка соединения
Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name, она говорит:
Выбрать все строки из таблицы Dovidnyktvaruntable, а из таблицы Tvarunutable выбрать только те, которые удовлетворяют условию Dovidnyktvaruntable.ID=TvarunuTable.name (если в Tvarunutable не будет записей по этому условию, то в соответствующих столбцах будет стоять значение NULL).
Следующая строка LEFT JOIN Personaltable ON Tvarunutable.domogospodarstvo=PersonalTable.domogospodarstvo также указывает на то что соединение внешнее, но происходит оно с результатом, который получен согласно условиям первой строки. Остальные соединения в этом запросе происходит по такому же принципу, каждое следующее с результатом предыдущей.
Что касается скорости исполнения запросов с использованием операторов JOIN, то они действительно выполняются дольше, чем при использовании старого способа соединения используя алиасы и фильтры после ключевого слова WHERE. Насколько дольше сказать точно нельзя, потому что скорость выполнения запроса будет зависеть:
1.От типа БД
2.От количества записей в таблицах
3.От индексированности столбцов или предопределенных в БД зависимостей
В общем, это нужно определять опытным путем для конкретного случая.

Надеюсь смог помочь. Удачи!
---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Специалист)
Ответ отправлен: 18.02.2008, 00:33
Оценка за ответ: 5
Комментарий оценки:
Благодарю din, вы действительно помогли. Благодаря вашим словам: "Следующая строка LEFT JOIN Personaltable ON Tvarunutable.domogospodarstvo=PersonalTable.domogospodarstvo также указывает на то что соединение внешнее, но происходит оно с результатом, который получен согласно условиям первой строки. Остальные соединения в этом запросе происходит по такому же принципу, каждое следующее с результатом предыдущей." я понял какая последовательность выполнения cоединений JOIN, когда их несколько


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.70 от 17.01.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное