Приветствую, не удается разобраться как работают множественные JOIN-ы (левое, правое и т.д.), точнее, в каком порядке пересекаются (по условиям ON) их таблицы, и как затем объединяются для конечного результата. собственно, более подробнее:
Данный запрос в формате последней спецификации SQL задает критерии выборки из нескольки таблиц при помощи предикатов, указанных в выражении типа объединения (left join table2 t2 on t2.id = t1.id), т.е. только те записи из таблиц t1 & t2, у которых id одинаковые.
select t1.*
from table1 t1
left join table2 t2 on t2.id = t1.id
left join table3 t3 on t3.id = t2.id
left join table4 t4 on t4.id = t3.id
left join table5 t5 on t5.id = t4.id
1. Если добавить новые join-ы, как в примере выше, к чему тогда будут применяться их предикаты:
1.1. к оригинальным данным в указанных таблицах
т.е. выражение
left join table3 t3 on t3.id = t2.idпросто объединит полностью все записи из
table2 и
table3 по условию
on t2.id = t1.id совершенно не обращая внимания на то, что было объединено в выражении
left join table2 t2 on t2.id = t1.id если да, то:
1.1.1. каким образом формируется конечный результат для select - неявно формируется некая промежуточная таблица и т.д.,
1.1.2. как объединяются результаты из каждых таблиц после каждого
left join on с результатами предыдущих выборок
1.2 либо же, каждое новое
left join on осуществляется с результатом предыдущего, например:
после
left join table2 t2 on t2.id = t1.id формируется неявная таблица, в которой только записи удовлетворяющие
on t2.id = t1.id и затем следующее объединение
left join table3 t3 on t3.id = t2.id джоинит именно эту неявную таблицу (сформированную после
on t2.id = t1.id) с
table3 и так далее
если да, то то же самое, как и для 1.1:
1.2.1. каким образом формируется конечный результат для selectт.д.,
1.2.2. как объединяются результаты из каждых таблиц после каждого
left join on с результатами предыдущих выборок
2. к какому результату будет применяться where: к неявно созданным промежуточным таблицам, уже включающим удовлетворяющие предикатам записи из таблиц, учавствующих в выражении
where или к чему-то другому ?
например:
...
left join table4 t4 on t4.id = t3.id
left join table5 t5 on t5.id = t4.id
where t2.meta_id = t4.meta_id
and (t1.meta_id = t5.meta_id and t1.id = t2.id)
3. То же самое, но для
GROUP BY и
HAVING4. так же просьба подсказать "правильную" книгу именно по самой теории реляционной алгебры применяемой в данной СУБД, без четкого понимания мат. модели стоящей за SQL, крайне сложно понимать все эти ньюансы.
с уважением.
Отредактированно oleg.borisov (03.11.2016 18:45:42)