4
« kdy: 19. 02. 2014, 22:06:31 »
Jakou máte verzi DB? Následující postup myslím funguje až od 10g. Také nevím, jaké mají být joiny, t.j. zda se má jméno zobrazit, když nejsou data v dalších tabulkách atd., takže jsme všude použil inner join čili každý záznam z t1 tabulky musí mít odpovídající záznam v dalších tabulkách.
Vytvořil jsem tři testovací tabulky:
create table table1 (
t1_id number,
name varchar2(20)
);
create table table2 (
t2_id number,
t1_id number,
address varchar2(20),
ins_date date
);
create table table3 (
t3_id number,
t1_id number,
something varchar2(20)
);
Obsahují tyto záznamy:
select * from table1;
T1_ID NAME
----- --------------------
1 JOHN
2 ADRIAN
3 VACLAV
select * from table2;
T2_ID T1_ID ADDRESS INS_DATE
----- ----- -------------------- --------
1 1 NEW YORK 24.10.13
2 1 CHICAGO 23.09.13
3 1 SAN FRANCISCO 23.11.13
4 2 DORTMUND 01.01.12
5 2 MUNCHEN 01.02.11
select * from table3;
T3_ID T1_ID SOMETHING
----- ----- --------------------
1 1 MERCEDES
2 1 HONDA
3 2 BMW
3 2 AUDI
3 2 HONDA
Váš požadavek by mohl splnit snad následující select:
select t1.name, t2.address, t3.something from table1 t1
inner join (select tmp.*, row_number() over (partition by tmp.t1_id order by tmp.ins_date asc) rn from table2 tmp) t2 on t1.t1_id = t2.t1_id and rn = 1
inner join table3 t3 on t3.t1_id = t1.t1_id
Výsledek:
NAME ADDRESS SOMETHING
-------------------- -------------------- --------------------
JOHN CHICAGO MERCEDES
JOHN CHICAGO HONDA
ADRIAN MUNCHEN BMW
ADRIAN MUNCHEN AUDI
ADRIAN MUNCHEN HONDA
Pokud byste potřeboval poslední adresu, stačí místo ASC použít DESC. Snad jsem pochopil zadání správně, kdyžtak dejte vědět a zkusíme to ještě poupravit.