Newsgroup: it.comp.software.database
Titolo: problemi di join

ho usato un subject "semplice" perche' non riesco a descrivere la 
situazione in maniera concisa:
 
il database usato e' un postgresql8.4
 
devo fare il join tra 2 tabelle su campi di tipo "date", nella prima 
tabella la colonna da joinare e' completa ( sono presenti tutti i 
valori ) , nella seconda tabella i valori presenti sono sparsi, magari 
ce ne e' solo uno su sette o dieci
avrei bisogno che in assenza di data nella seconda tabella venga usato 
il record con la data appena precedente ( che e' garantito esserci SEMPRE )
 
attualmente per risolvere il problema espando la seconda tabella in una 
tabella ausiliaria che e' la sua versione completa e poi faccio il join 
convenzionale, soluzione che pero' non mi piace moltissimo, anche 
perche' le due tabelle si espandono progressivamente ( la prima 
giornalmente in maniera automatica, la seconda a comando )
 
faccio un esempio esemplificativo di quello che vorrei avere:
 
tabella A:
k1       v1
'2014-10-1','AA'
'2014-10-2','BB'
'2014-10-3','CC'
'2014-10-4','DD'
'2014-10-5','EE'
'2014-10-6','FF'
'2014-10-7','GG'
 
tabella B:
k2       v2
'2014-10-1','A1'
'2014-10-4','A2'
'2014-10-7','A3'
 
join tabella A con tabella B :
A.k1      A.v1 B.k2      B.v2
2014-10-1 AA   2014-10-1 A1
2014-10-2 BB   2014-10-1 A1		<- notare lo shift
2014-10-3 CC   2014-10-1 A1
2014-10-4 DD   2014-10-4 A2
2014-10-5 EE   2014-10-4 A2
2014-10-6 FF   2014-10-4 A2
2014-10-7 GG   2014-10-7 A3
 


Ciao,
 
con la colonna di tipo DATE non è impossibile (essendo possibile 
un'ordinamento), per l'altra non mi è venuto in mente nulla.
TEstato su uan 8.3, non ho 8.4 a disposizione, ma non credo ci siano
problemi.
 
 
------------ CONTESTO:
 
 dbhist=# select * from t1;
     k1     | v1 
------------+----
 2014-10-01 | AA
 2014-10-02 | BB
 2014-10-03 | CC
 2014-10-04 | DD
 2014-10-05 | EE
 2014-10-06 | FF
 2014-10-07 | GG
(7 rows)
 
dbhist=# select * from t2;
     k2     | v2 
------------+----
 2014-10-01 | A1
 2014-10-04 | A2
 2014-10-07 | A3
(3 rows)
 
dbhist=# select * from t1 inner join t2 on (t1.k1=t2.k2);
     k1     | v1 |     k2     | v2 
------------+----+------------+----
 2014-10-01 | AA | 2014-10-01 | A1
 2014-10-04 | DD | 2014-10-04 | A2
 2014-10-07 | GG | 2014-10-07 | A3
(3 rows)
 
dbhist=# select * from t1 left outer join t2 on (t1.k1=t2.k2);
     k1     | v1 |     k2     | v2 
------------+----+------------+----
 2014-10-01 | AA | 2014-10-01 | A1
 2014-10-02 | BB |            | 
 2014-10-03 | CC |            | 
 2014-10-04 | DD | 2014-10-04 | A2
 2014-10-05 | EE |            | 
 2014-10-06 | FF |            | 
 2014-10-07 | GG | 2014-10-07 | A3
(7 rows)
 
------------ (SEMI) SOLUZIONE:
 
dbhist=# select t1.k1, t1.v1, case when t2.k2 IS NULL then (select max
(t2.k2) from t2 where t2.k2 <= t1.k1)  else t1.k1 end, t2.v2 from t1 left 
outer join t2 on (t1.k1=t2.k2);
 
     k1     | v1 |     k1     | v2 
------------+----+------------+----
 2014-10-01 | AA | 2014-10-01 | A1
 2014-10-02 | BB | 2014-10-01 | 
 2014-10-03 | CC | 2014-10-01 | 
 2014-10-04 | DD | 2014-10-04 | A2
 2014-10-05 | EE | 2014-10-04 | 
 2014-10-06 | FF | 2014-10-04 | 
 2014-10-07 | GG | 2014-10-07 | A3
 

 
 
tra 8.3 a 9.x non mi sembra che ci siano sostanziali aggiunte in questo 
ambito
 
era "sottinteso" che il dato della colonna di join e' ti tipo ordinale, 
altrimenti tutta la MIA pippa non aveva senso
 
effettivamente la soluzione e' parziale, ma mi ha dato degli ottimi 
spunti che dovro' approfondire ( nota: le altre colonne da t2 servono in 
quanto ci sono i dati significativi per le successive elaborazione)
 
provero' a seguire la strada di una subquery ( with t_temp as (....) ) 
in cui avere la data per la seconda tabella e poi fare un join a 3:
 
t1 -> t_temp -> t2
 
dove in t_temp per ogni riga di t1 ci faccio arrivare la data "giusta" 
per t2

Di nuovo grazie!!

 Di nuovo grazie!!
 
 
 
di nulla
ciao