Problem 5. Employees Without Project - MSSQL - Софтуерен университет

+ Нов въпрос
sevdalin avatar sevdalin 37 Точки

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 обаче казва, че това е грешен резултат и не разбирам защо?

Пробвахме да я решим с един от трейнърите на курса, обаче не успяхме. Някакви идеи?

Тагове:
0
Databases Basics
fbinnzhivko avatar fbinnzhivko 1055 Точки
select top 3 e.EmployeeID, e.FirstName from Employees as e
full join EmployeesProjects as ep
on e.EmployeeID = ep.EmployeeID
where ep.EmployeeID is null

order by e.EmployeeID

 

Минава в Judje.Ти ще си е форматираш правилно.
Лошото е че има само по един тест а на Java DB същите задачи има поне 3 - 4 теста.

1
13/09/2017 11:49:51
sevdalin avatar sevdalin 37 Точки

Можеш ли да обясниш, каква е разликата да използваме проверката при ON и при WHERE, какво всъщност се случва "вътер" за да дава различни резултати. 

Също така, ако можеш да дадеш някакъв съвет, как по-лесно да правя преценка, кога трябва да включва логиката в ON и кога в WHERE, ще бъде страхотно, защото в момента е едно налучкване едва ли не, т.е. не разбирам разликата в детайли и за това не го схващам.

0
fbinnzhivko avatar fbinnzhivko 1055 Точки

ОN се използва за да покажеш кои две колони са равни ( Primary key в едната таблица  FOREIGN KEY в другата таблица) 
WHERE се използва когато искаш да зададеш допълнително ограничение (филтрираш данните по някакво условие) към данните в дадена колана от таблица.

В твоята заявка има 3 грешки
1.LEFT JOIN - вземи само съвпаденията от таблицата в ляво което е първата таблица.
Трябва е FULL JOIN всички съвпадения и от двете таблици една спрямо друга.
2.ОN го използваш за да покажеш по коя колона от таблица 1 да търси същата стойност в колона в таблица 2.
3.WHERE не си го сложил.
За да покажеш от всички съвпадения да вземе само тези който имат стойност null.

Надявам се да съм го обяснил разбираемо. 

0
13/09/2017 22:06:33
sevdalin avatar sevdalin 37 Точки

Разбирам те какво искаш да ми обясниш, но имам няколко въпроса:

1. При използването на ON, задължително ли трябва да се използва върху PK/FK или може и върху други колони, също така комбинация от PK/FK + други колони. Всъщност докато пиша въпроса май си отговорих сам. Отговора е, че принципно не е задължително да е върху PK/FK, но просто PK/FK са стойностите по които може да има съвпадения, за да се слеят таблиците, защото това е тяхната цел дефакто. Иначе ако сравняваме 2 други колони, най-вероятно няма да имат еднакви стойности една с друга. Разбира се може да имаме и такива 2 колони, които да имат еднакви стойности поради някаква причина, но това като цяло няма да бъде много удачно. Това е моето обяснение, остава да кажеш дали е правилно :)

2. Защо да е FULL JOIN, след като ние търсим така или иначе, всички стойности в дясно, които ще са с "ep.EmployeeID = NULL", по този начин, селекцията ни става по малка, тъй като в ляво винаги ще искаме да имаме EmployeeID различно от NULL?

0
ambiorix avatar ambiorix 509 Точки

Аз ще ти предложа друга логика, която според мен е по-правилна спрямо условието на задачата макар да дава същия резултат:

SELECT TOP(3) e.EmployeeID, e.FirstName
FROM Employees AS e
LEFT OUTER JOIN EmployeesProjects AS ep ON e.EmployeeID = ep.EmployeeID
WHERE ep.ProjectID IS null
ORDER BY e.EmployeeID

 

Взимам всички работници и долепям до тях всички проекти(който няма нито един проект там ще има NULL). След това взимам само тези които нямат проект - името на работника и срещу него за projectId има NULL.

0
16/09/2017 13:09:10
sevdalin avatar sevdalin 37 Точки

Колега, ти прочете ли моят статус, защото моят код е 1 към 1 с твоето предложение?

0
ambiorix avatar ambiorix 509 Точки

Не е едно към едно. Ти не използваш WHERE което ти е създало проблема и другият колега вече ти е казал.

Второ - условието ти е EmployeeID да е NULL, а не ProjectID.

1