у мене 3 таблиці
команди
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
службовців
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
мій запит
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
вона відображається як
id name
6 WD
7 LGO
але я хочу відобразити назву батьківської команди лише в тому випадку, якщо в принаймні є один працівник або в батьківській, або в дочірній команді. тобто вихід як
team_id name
6 WD
7 LGO
12 SO
15 CRO
Будь ласка, допоможіть мені написати запит, і результат повинен відображатися як результат вище
Дякую
Відповіді:
0 для відповіді № 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
Цей код знаходиться в SQL Server
Тут підзапит повертає дублікати значень, і ми не можемо використовувати відмінний з оператором case. Щоб уникнути дублювання значень і отримати внутрішнє з'єднання імені батьківської команди з підзапитом, потрібно
0 для відповіді № 2
ось як має виглядати ваш запит
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"
Ви можете використовувати НАЗАЄМНИЙ ВІД для свого запиту.
Потім я видалив пункт GROUP BY і замінив його DISTICNT.
Я просто використовую ідентифікатор CAST (t.id AS INT), щоб результат був упорядкований, і в будь-якому випадку ви можете просто видалити частину, яка відлита, єдина відмінність - це розташування результату.