Aktywne Wpisy
ZionOfel +64
Taka sytuacja.
https://www.facebook.com/share/p/12313jswNo4E9Roo/
#ocean #huragan #klimat #pogoda #ciekawostki
https://www.facebook.com/share/p/12313jswNo4E9Roo/
#ocean #huragan #klimat #pogoda #ciekawostki
IT zawsze będzie gorsze od prawa i medycyny. Mamy 3 branże "premium" w tym kraju, ale prawdziwie elitarne są tylko prawo i medycyna. A to dlatego, że IT to wolny rynek. Prawnicy i lekarze dbają o to, żeby za dużo ludzi nie mogło studiować jednocześnie, skutecznie blokują dostęp do sensownych specjalizacji tak aby ciągle był niedobór ludzi i żeby stawki nie spadły za bardzo. Taki neurochirurg w topowym szpitalu potrafi zarobić nawet
Mamy zapytanie w ANSI łączące trzy tabele. Daje ono 106 wierszy:
select first_name, last_name, department_name, job_title
from employees e
right join departments d on e.department_id = d.department_id
right join jobs j on e.job_id = j.job_id;
Ale jeżeli przekształcimy je na non-ANSI syntax, to robi się cross join tabeli departments z tabelą jobs, i wychodzi już 600 wierszy:
select first_name, last_name, department_name, e.department_id, d.department_id, j.job_title, e.job_id, j.job_id
from employees e, departments d, jobs j
where e.department_id(+) = d.department_id
and e.job_id(+) = j.job_id;
Dlaczego tak się dzieje? Wiem jak to naprawić, ale może mi ktoś powiedzieć jaka logika za tym stoi? Bo normalnie najpierw łączą się tabele employees z departments, a dopiero później rezultat tego połączenia łączy się z jobs. Ale przy non-ANSI to nie działa.
Jest to domyślna HR schema od Oracle:
--------------- -------- ------------
Employees (107 rows):
EMPLOYEE_ID
FIRST_NAME
LAST_NAME
EMAIL
PHONE_NUMBER
HIRE_DATE
JOB_ID
SALARY
COMMISSION_PCT
MANAGER_ID
DEPARTMENT_ID
-------------- -------- ------------
Departments (27 rows):
DEPARTMENT_ID
DEPARTMENT_NAME
MANAGER_ID
LOCATION_ID
-------------- -------- ------------
Jobs (19 rows):
JOB_ID
JOB_TITLE
MIN_SALARY
MAX_SALARY
--------------- -------- ------------
#sql #oracle #programowanie
Rozumiem problem, z którym się borykasz. Wygląda na to, że doświadczasz problemu wynikającego z różnic w zachowaniu składni ANSI i non-ANSI podczas wykonywania wielokrotnych zewnętrznych łączeń (RIGHT JOINs).
Oto, co się dzieje w obu przypadkach:
łącząc przez joina a=b już robisz filtrację wyniku bo tylko pokaże Ci dane gdzie a=b
no ansi nie na logiki(tu przykład tej "logiki") wychodzi Ci za dużo pewnie niepotrzebnych danych które później w where musisz umiejętnie przefiltrować
są przypadki gdzie powinniśmy użyć cross joina, ale to nie jest ten przypadek