mam 3 stoły
zespoły
id name
6 WD
7 LGO
10 PS
11 EM
12 SO
13 DM
14 DMS
15 CRO
16 T / T
team_mapping
id team_id parent_team_id
1 6 0
2 7 0
3 10 7
4 11 7
5 12 0
6 13 12
7 14 12
8 15 0
9 16 15
pracowników
id name team_id
3 Bk 6
4 Nr 6
5 SV 7
6 GK 10
7 JPD 13
8 BSY 16
9 MK 16
10 Ps 16
11 Bji 16
moje zapytanie jest
SELECT t.*
FROM teams t
INNER JOIN employees e ON t.id = e.team_id
INNER JOIN team_mapping tm ON t.id = tm.team_id
WHERE tm.parent_team_id = "0"
GROUP BY t.id
wyświetla się jak
id name
6 WD
7 LGO
ale chcę wyświetlać nazwę zespołu nadrzędnego tylko wtedy, gdy przynajmniej jeden pracownik w zespole nadrzędnym lub podrzędnym. tj. wyjście jak
team_id name
6 WD
7 LGO
12 SO
15 CRO
Proszę, pomóż mi napisać zapytanie, a wynik powinien zostać wyświetlony jak powyżej
Dzięki
Odpowiedzi:
0 dla odpowiedzi № 1select distinct id, name
from teams t inner join
(SELECT case when tm.parent_team_id = 0 then tm.team_id else tm.parent_team_id end as TID
FROM teams t
INNER JOIN team_mapping tm ON t.id = tm.team_id
INNER JOIN employees e ON tm.team_id = e.team_id ) as table2
on t.id = table2.TID
Ten kod jest w SQL Server
W tym przypadku zapytanie podrzędne zwraca zduplikowane wartości, a my nie możemy używać odrębnych instrukcji case. Aby uniknąć duplikatów wartości i uzyskać nazwę zespołu nadrzędnego, konieczne jest wewnętrzne połączenie z zapytaniem podrzędnym
0 dla odpowiedzi nr 2
oto jak powinno wyglądać twoje zapytanie
SELECT DISTINCT CAST(t.id AS INT) id,t.name
FROM teams t
LEFT JOIN employees e ON t.id = e.team_id
LEFT JOIN team_mapping tm ON t.id = tm.team_id
WHERE tm.parent_team_id = "0"
Do zapytania możesz użyć LEWEGO DOŁĄCZENIA.
Następnie usunąłem klauzulę GROUP BY i zastąpiłem ją DISTICNT.
Po prostu używam identyfikatora CAST (t.id AS INT), aby wynik był ułożony, tak czy inaczej można po prostu usunąć część odlewaną, jedyną różnicą jest ułożenie wyniku.