Problem 5. Employees Without Project - MSSQL
Здравейте, имам следната задача:
Write a query that selects:
- EmployeeID
- FirstName
Filter only employees without a project. Return the first 3 rows sorted by EmployeeID in ascending order.
Написах следната заявка:
SELECT TOP 3 e.EmployeeID, e.FirstName FROM Employees AS [e]
LEFT JOIN EmployeesProjects AS [ep]
ON (e.EmployeeID = ep.EmployeeID
AND ep.EmployeeID IS NULL)
ORDER BY e.EmployeeID
По-този начин ми взема всички, които имат NULL за EmployeeID в таблицата EmployeesProjects, която е Mapping Table.
Judge обаче казва, че това е грешен резултат и не разбирам защо?
Пробвахме да я решим с един от трейнърите на курса, обаче не успяхме. Някакви идеи?
Можеш ли да обясниш, каква е разликата да използваме проверката при ON и при WHERE, какво всъщност се случва "вътер" за да дава различни резултати.
Също така, ако можеш да дадеш някакъв съвет, как по-лесно да правя преценка, кога трябва да включва логиката в ON и кога в WHERE, ще бъде страхотно, защото в момента е едно налучкване едва ли не, т.е. не разбирам разликата в детайли и за това не го схващам.
ОN се използва за да покажеш кои две колони са равни ( Primary key в едната таблица = FOREIGN KEY в другата таблица)
WHERE се използва когато искаш да зададеш допълнително ограничение (филтрираш данните по някакво условие) към данните в дадена колана от таблица.
В твоята заявка има 3 грешки
1.LEFT JOIN - вземи само съвпаденията от таблицата в ляво което е първата таблица.
Трябва е FULL JOIN всички съвпадения и от двете таблици една спрямо друга.
2.ОN го използваш за да покажеш по коя колона от таблица 1 да търси същата стойност в колона в таблица 2.
3.WHERE не си го сложил.
За да покажеш от всички съвпадения да вземе само тези който имат стойност null.
Надявам се да съм го обяснил разбираемо.
Разбирам те какво искаш да ми обясниш, но имам няколко въпроса:
1. При използването на ON, задължително ли трябва да се използва върху PK/FK или може и върху други колони, също така комбинация от PK/FK + други колони. Всъщност докато пиша въпроса май си отговорих сам. Отговора е, че принципно не е задължително да е върху PK/FK, но просто PK/FK са стойностите по които може да има съвпадения, за да се слеят таблиците, защото това е тяхната цел дефакто. Иначе ако сравняваме 2 други колони, най-вероятно няма да имат еднакви стойности една с друга. Разбира се може да имаме и такива 2 колони, които да имат еднакви стойности поради някаква причина, но това като цяло няма да бъде много удачно. Това е моето обяснение, остава да кажеш дали е правилно :)
2. Защо да е FULL JOIN, след като ние търсим така или иначе, всички стойности в дясно, които ще са с "ep.EmployeeID = NULL", по този начин, селекцията ни става по малка, тъй като в ляво винаги ще искаме да имаме EmployeeID различно от NULL?