Wpis z mikrobloga

Wie ktoś dlaczego to zapytanie zwraca 2650 wyników, ale jeżeli do SELECT dodamy jeszcze country_id to zwróci już tylko 106 wyników?

select first_name, last_name, d.department_name, city, postal_code, street_address
from employees e
join departments d
on (e.department_id = d.department_id)
join locations l
using (location_id)
natural join countries;

#sql #oracle
  • 10
@Rajtuz jeśli country_id jest w tabeli locations to zamiast joina użyj left join
https://www.w3schools.com/sql/sql_join.asp
tutaj fajnie są opisane łączenia w bardzo prosty sposób
aby ogarnąć łączenia wyobraź sobie że to są dwa zbiory danych i każde łączenie bierze jakaś część(albo całość) jednego i drugiego
przez joina można zrobić też wstępna filtrację danych ale do tego jeszcze dojdziesz :)
@Maniakrzelaza: nigdy, to trochę za dużo powiedziane, jeśli baza jest dobrze zaprojektowana, to integralność danych powinna być zapewniona i wtedy zalecane jest używanie joinow, bo są szybsze od left joinow. Oczywiście zakładając że robimy joiny po właściwych kluczach.
  • 0
@kocio90: Ok, tylko dlaczego na końcu zrobiło się połączenie kartezjańskie? Bo rozumiem, że najpierw wykonuje się pierwszy join (employees z departments, 106 wyników), później jego rezultat łączony jest z drugim joinem (czyli z locations, też 106 wyników), i rezultat drugiego joina łączony jest z countries przez natural join.
Normalnie, jeżeli natural join nie znajdzie kolumn o tej samej nazwie i tym samym data typie, to robi kartazjana. Tylko że przy ostatnim
@Rajtuz wiesz nie widzę tej bazy ani na nich danych aby bardziej precyzyjne Ci podpowiedzieć, ale skoro po pierwszym łączeniu masz 106 wyników to wychodzi na to że jest problem z pierwszym łączeniem, więc jak złączysz employees (2650 wyników) zwykłym joinem z departments (106 wyników) to pokaże Ci część wspólna czyli 106 wyników. jeśli użyjesz left joina :
left join depertnents d
on e.deparmentid = d.deparmentid
to powinieneś mieć więcej
@Rajtuz jak robisz złączenie join to masz wszystko do wszystkiego. Zawsze podaje dodatkowe warunki po jakim kluczu maja się połączyć tabele