Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 05:02 25.06.24 
Клубове/ Компютри и Интернет / Бази данни Всички теми Следваща тема Пълен преглед*
Информация за клуба
Тема По принцип има [re: bal-bal]
Автор TPECKATA (втрещен)
Публикувано30.03.07 21:46  



При left join би трябвало филтрирането на редовете от отделните таблици да е преди обединяването на данните от тях.

При

и select ... from t1,t2,t3 обединяването на данните е пълна комбинация от всички редове от всяка от таблиците, след което се извършва филтриране според where клаузите.

Възможно е някои СБД да оптимизират cross-join заявките до left и right join заявки, но аз лично ще ти препоръчам да си указваш изрично типа на комбиниране на записите от таблиците, по следните причини:
Неоптимизиран (вътрешно от СБД) cross-join в сравнение с left outer/right outer join:
1. ползва повече памет за временни резултати от изпълнение на заявката
2. извършва повече сравнения, тъй като филтрирането се извършва след, а не преди комбинирането на редовете от таблиците.
3. много по-трудно се проследява програмна логика (left outer join автоматично означава релация тип "едно-към-много", респективно right outer join е "много-към-едно"), докато при cross-join-а тези връзки не са явни и трябва да се разглежда where клаузата под лупа.

Представи си cross-join от 9 таблици - 1 главна, 2 подчинени и 6 lookup (т.е. съдържащи еквивалети на кодове/идентификатори с имена/символни низове) как ще изглежда и представи си колко по-ясно ще изглежда същата заявка с 8 left outer join-а.
Вярно че заявката с left outer join ще е по-дълга като текст, но ще е много по-лесно да се ориентираш в нея за какво става въпрос, отколкото в cross-join-а.
Не дай боже да се наложи да правиш и union на два, три и повече резултата от такива заявки.

Освен това при left outer join също можеш да имаш where, но там вече ще сложиш условията за филтриране на резултата от join-а.


Сега се сетих, че ако нямаш еквивалентен ред за даден идентификатор от главната таблица в подчинената/lookup таблицата, то при cross-join ще загубиш този ред, тъй като няма да имаш редове с идентификатор null за подчинената таблица.
Т.е. ако потребителя си е изтрил по погрешка всички редове в подчинената, или еквивалентния ред в lookup таблицата, то този ред от главната таблица, няма да бъде изведен при cross-join с последващ where филтър.

Примерно имаш общи данни за фактура с даден номер, и нямаш нито една позиция все още по тази фактура (т.е. потребителя още не е попълнил редовете с данни за фактурата).
В този случай, ако поиска справка за фактурите заедно с позициите по тях, няма да можеш да покажеш тази фактура и да кажеш че по нея няма позиции ако ползваш cross-join.

Друг пример - имаш таблица която ти дава съответствия по пощенски код и населено място. Ако ползваш пощенския код за идентификатор на населеното място (в главната таблица) и в случай че за дадения пощенски код нямаш съответен в таблицата със съответствия, то при cross-join ще загубиш този ред от главната таблица, докато при left outer join ще имаш null, като име на населеното място.

Накратко казано cross join с where t1.id = t2.id е еквивалентен на inner join, като резултат, но като изпълнение е много по-бавен.

За да реализираш еквивалент на left outer join с cross join-и, трябва да ползваш union и подзаявка с not exists() като условие за нея.
т.е. Обедини (union) всички записи за които t1.id = t2.id с тези записи от t1, за които няма ред в t2, с id = t1.id
За да мине union-а трябва да зададеш изрично null As t2.column1, null As t2.column2 за всяка от колоните от t2, които ти участват в заявката.
Надявам се след това последното да ти е станала поне малко ясна разликата между двете.

Редактирано от TPECKATA на 30.03.07 22:08.



Цялата тема
ТемаАвторПубликувано
* LEFT JOIN vs RIGHT JOIN jmut   26.04.05 14:05
. * Re: LEFT JOIN vs RIGHT JOIN salle   26.04.05 16:06
. * Re: LEFT JOIN vs RIGHT JOIN jmut   26.04.05 17:00
. * Re: LEFT JOIN vs RIGHT JOIN тoшo   27.04.05 00:06
. * Re: LEFT JOIN vs RIGHT JOIN jmut   27.04.05 10:30
. * Re: (a > b) != (a < b) :) salle   27.04.05 11:21
. * Re: LEFT JOIN vs RIGHT JOIN nasko   27.04.05 11:26
. * Re: LEFT JOIN vs RIGHT JOIN тoшo   28.04.05 06:53
. * Re: LEFT JOIN vs RIGHT JOIN jmut   28.04.05 09:53
. * Теоретично TPECKATA   15.11.05 21:12
. * Re: Теоретично bal-bal   30.03.07 21:14
. * По принцип има TPECKATA   30.03.07 21:46
. * Re: По принцип има bira_more   31.03.07 01:30
. * Re: По принцип има wqw   03.04.07 15:12
. * Re: По принцип има TPECKATA   03.04.07 16:12
. * Re: По принцип има wqw   03.04.07 18:55
. * Re: По принцип има TPECKATA   03.04.07 19:03
. * Re: По принцип има wqw   03.04.07 19:46
. * Тези заявки са еквивалентни, защото TPECKATA   03.04.07 20:39
. * Re: Тези заявки са еквивалентни, защото wqw   04.04.07 12:11
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.