Имам 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
Тук подзапитването връща дублиращи се стойности и не можем да използваме разграничение с оператора на случая. За да се избегнат дублиращи се стойности и да се получи вътрешно присъединяване на името на родителския екип с подзапитване
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"
Можете да използвате LEFT JOIN за вашата заявка.
Тогава премахнах клаузата GROUP BY и я замених с DISTICNT.
Просто използвам CAST (t.id AS INT) id, така че резултатът ще бъде подреден, така или иначе можете просто да премахнете актьорската част, като единствената разлика е подреждането на резултата.