Zawsze możemy pośmiać się z prowadzącego, że inner joiny są mało pouczajace, można podejść kreatywnie do problemu i rozwiązać bez joina, wtedy naprawdę można się sporo nauczyć, wiec edukacyjny walor na pewno jest zachowany:
Dla SQL = 2017
select
last_name
,(select STRING_AGG(last_name,',') from employees c where c.departament_id = e.departament_id and e.employee_id <> c.employee_id ) COLLEAGUE
from
employees e
Dla SQL >=2005
select
last_name
, STUFF((select
', ' + last_name
from
employees c
where
c.department_id = e.department_id
and e.employee_id <> c.employee_id
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,2,'') COLLEAGUE
from
employees e
Rekurencja
with cteR as(
select
1 N
,employee_id
,last_name
,last_name COLLEAGUE
,department_id
from
employees
union all
select
N+1
,c.employee_id
,c.last_name
,cteR.last_name COLLEAGUE
,c.department_id
from
employees c
inner join cteR on cteR.department_id = c.department_id and cteR.employee_id <> c.employee_id
where
cteR.N = 1
)
select last_name,COLLEAGUE,department_id from cteR
where n > 1
order by 1
Kursor:
DECLARE @results TABLE (
employee_id INT
,last_name VARCHAR(25)
,department_id INT
,COLLEAGUE VARCHAR(25)
)
DECLARE @e as CURSOR;
DECLARE @eID as INTEGER
declare @last_name as varchar(25)
declare @dID as integer
SET @e = CURSOR FORWARD_ONLY FOR
SELECT employee_id, last_name, department_id FROM employees
OPEN @e
FETCH NEXT FROM @e INTO @eID, @last_name, @dID;
WHILE @@FETCH_STATUS = 0
BEGIN
insert into @results
select
@eID
,@last_name
,department_id
,last_name
from
employees c
where
c.department_id = @dID
and employee_id<>@eID;
FETCH NEXT FROM @e INTO @eID, @last_name, @dID;
END
close @e
deallocate @e
select
last_name
,department_id
, COLLEAGUE
from
@results
Więc nie popieram szydery i heheszków z prowadzącego uważam to za rozwijające, tylko trzeba wyjść z poziomu myślenia o tym, że prowadzący jest głupi, a zastanawić się faktycznie nad rozwiązaniem. Sam pisałeś, ze celem "zabrania" joinów nie jest ich negacja... sam widzę jeszcze 3 rozwiązania nie uzywające joinów.