Loading...
sevdalin avatar sevdalin 38 Точки

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 1586 Точки
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 38 Точки

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

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

0
fbinnzhivko avatar fbinnzhivko 1586 Точки

О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 38 Точки

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

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

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

0
ambiorix avatar ambiorix 640 Точки

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

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 38 Точки

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

0
ambiorix avatar ambiorix 640 Точки

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

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

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.