Cześć,
mam 'proste' zadanie niby na 15 minut ale rozwiązanie go zajęło mi 2h i w dodatku nie jestem zadowolony z rozwiązania. Mam wrażenie że dopadła mnie nie moc i że da się to zrobić w prosty sposób :).
Są trzy tabele student, przedmiot, sport, autor. Czyli student ma ulubiony przedmiot, sport i autora książek.
create table
student
(s_id int
,s_nazwa varchar(50));
create table
przedmiot
(p_id int
,s_id int
,p_nazwa varchar(50));
create table
sport
(sp_id int
,s_id int
,sp_nazwa varchar(50));
create table
autor
(au_id int
,s_id int
,au_nazwa varchar(50));
-----------------------
insert into
student
values(1,'Kowalski')
,(2,'Maliniak');
insert into przedmiot
values (10,1,'matematyka')
,(11,1,'fizyka')
,(12,1,'metereologia')
,(13,2,'materiałoznastwo')
,(14,2,'socjologia');
insert into sport
values (20,1,'ping-pong')
,(21,1,'p. nożna')
,(22,1,'surfing')
,(23,1,'narciarstwo');
insert into autor
values (30,2,'Mickiewicz')
,(31,2,'Sienkiewicz')
,(32,2,'Prus')
,(33,2,'Shakespeare');
---
Należy napisać zapytanie które zwróci dane w taki sposób:
Gdyby nie to w jaki sposób są wyświetlane dane, zadanie byłoby proste. Matematyka musi się znaleźć w wierszu razem z ping-pong itd. Normalnie zrobiłbym to już po stronie aplikacji, ale zadanie jest z sql.
Udało mi się to zrobić ale zapytanie jest fatalne:
Select s.s_id, s.s_nazwa, T1.p_nazwa, T2.sp_nazwa, T3.au_nazwa FROM
(
select
s.s_id * 100 + row_number() over (partition by lower(s.s_id) order by s.s_id) as rn,
s.s_id
,p.p_id
,p.p_nazwa
from student as s
LEFT JOIN PRZEDMIOT AS P
ON s.s_id = p.s_id
) as T1
FULL JOIN (
select
s.s_id * 100 + row_number() over (partition by lower(s.s_id) order by s.s_id) as rn,
s.s_id,
sp.sp_id,
sp.sp_nazwa
from student as s
LEFT JOIN SPORT AS SP
ON s.s_id = sp.s_id ) as T2
ON T1.rn = T2.rn
FULL JOIN
(
select
s.s_id * 100 + row_number() over (partition by lower(s.s_id) order by s.s_id) as rn,
s.s_id,
au.au_id,
au.au_nazwa
from student as s
LEFT JOIN autor AS au
ON s.s_id = au.s_id
) as T3
ON T1.rn = T3.rn
JOIN student s
ON s.s_id = T1.s_id or s.s_id = T2.s_id or s.s_id = T3.s_id
order by s_id
Link do sqlfiddle