/ / SQL - wyświetlanie nazwy zespołu nadrzędnego zależy od zespołu podrzędnego co najmniej jednego pracownika - sql, postgresql

Wyświetlanie nazwy zespołu nadrzędnego SQL zależy od zespołu podrzędnego co najmniej jednego pracownika - sql, postgresql

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 № 1
select 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.