Merge/Join

Merge/Join

am 07.02.2007 15:40:13 von Lambros Rizos

Ich habe drei Tabellen die ich verknuepfen moechte:

T1 T2 T3
Ind w1 Ind w2 d Ind w3 d
1 111 1 211 01.02.2006 1 311 01.02.2006
2 112 1 212 02.02.2006 1 312 02.02.2006
3 113 2 221 01.03.2006 1 313 03.02.2006
4 114 2 222 01.04.2006 2 321 01.03.2006
3 231 01.05.2006 2 322 01.04.2006
3 232 02.05.2006
4 241 01.06.2006
4 242 01.07.2006


Abfrage-Ziel : Eine Tabelle aller Werte
Bedingungen:
1) T1.Ind=T2.Ind=T3.Ind
2) T2.d=T3.d

Nebenbedingung
Wenn 2) nicht zutrifft, soll T1.Ind,T1.w1 + die jeweils
vorhandene Zeile aus T2 oder T3 zurueckgeliefert werden

Also Wunsch-Ziel:
Ind w1 Ind w2 d Ind w3 d
1 111 1 211 01.02.2006 1 311 01.02.2006
1 111 1 212 02.02.2006 1 312 02.02.2006
1 111 1 313 03.02.2006
2 112 2 221 01.03.2006 2 321 01.03.2006
2 112 2 222 01.04.2006 2 322 01.04.2006
3 113 3 231 01.05.2006
3 113 3 232 02.05.2006
4 114 4 241 01.06.2006
4 114 4 242 01.07.2006


Erreicht:
1 111 1 212 02.02.2006 1 312 02.02.2006
1 111 1 211 01.02.2006 1 311 01.02.2006
1 313 03.02.2006
2 121 2 222 01.04.2006 2 322 01.04.2006
2 121 2 221 01.03.2006 2 321 01.03.2006
3 131 3 231 01.05.2006
3 131 3 232 02.05.2006
4 141 4 241 01.06.2006
4 141 4 242 01.07.2006

mit
select * from t1
left join t2 on ( t1.pa=t2.pa)
full join t3 on(t1.pa=t3.pa and t2.d=t3.d)

Wie komme ich weiter?
Danke und entschuldigt bitte den Roman, Lambros

Re: Merge/Join

am 07.02.2007 18:37:25 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Merge/Join

am 07.02.2007 23:11:15 von dnoeth

Lambros Rizos wrote:

> T1 T2 T3
> Ind w1 Ind w2 d Ind w3 d
> 1 111 1 211 01.02.2006 1 311 01.02.2006
> 2 112 1 212 02.02.2006 1 312 02.02.2006
> 3 113 2 221 01.03.2006 1 313 03.02.2006
> 4 114 2 222 01.04.2006 2 321 01.03.2006
> 3 231 01.05.2006 2 322 01.04.2006
> 3 232 02.05.2006
> 4 241 01.06.2006
> 4 242 01.07.2006
>
>
> Abfrage-Ziel : Eine Tabelle aller Werte
> Bedingungen:
> 1) T1.Ind=T2.Ind=T3.Ind
> 2) T2.d=T3.d
>
> Nebenbedingung
> Wenn 2) nicht zutrifft, soll T1.Ind,T1.w1 + die jeweils
> vorhandene Zeile aus T2 oder T3 zurueckgeliefert werden
....
> select * from t1
> left join t2 on ( t1.pa=t2.pa)
> full join t3 on(t1.pa=t3.pa and t2.d=t3.d)

Fast, nur die Reihenfolge der Joins ist falsch :-)

Ich bin mir nicht ganz sicher, aber das dürfte stimmen:

select * from t2 full join t3 on(t1.pa=t3.pa and t2.d=t3.d)
right join t1 on t1.ind=coalesce(t2.ind,t3.ind)

Dieter

Re: Merge/Join

am 08.02.2007 10:55:26 von Lambros Rizos

"Dieter Noeth" schrieb im Newsbeitrag
news:eqdiqv$ene$1@online.de...
> Lambros Rizos wrote:
>
> > T1 T2 T3
> > Ind w1 Ind w2 d Ind w3 d
> > 1 111 1 211 01.02.2006 1 311 01.02.2006
> > 2 112 1 212 02.02.2006 1 312 02.02.2006
> > 3 113 2 221 01.03.2006 1 313 03.02.2006
> > 4 114 2 222 01.04.2006 2 321 01.03.2006
> > 3 231 01.05.2006 2 322 01.04.2006
> > 3 232 02.05.2006
> > 4 241 01.06.2006
> > 4 242 01.07.2006
> >
> >
> > Abfrage-Ziel : Eine Tabelle aller Werte
> > Bedingungen:
> > 1) T1.Ind=T2.Ind=T3.Ind
> > 2) T2.d=T3.d
> >
> > Nebenbedingung
> > Wenn 2) nicht zutrifft, soll T1.Ind,T1.w1 + die jeweils
> > vorhandene Zeile aus T2 oder T3 zurueckgeliefert werden
> ...
> > select * from t1
> > left join t2 on ( t1.pa=t2.pa)
> > full join t3 on(t1.pa=t3.pa and t2.d=t3.d)
>
> Fast, nur die Reihenfolge der Joins ist falsch :-)
>
> Ich bin mir nicht ganz sicher, aber das dürfte stimmen:
>
> select * from t2 full join t3 on(t1.pa=t3.pa and t2.d=t3.d)
> right join t1 on t1.ind=coalesce(t2.ind,t3.ind)
>
> Dieter

Danke Dieter,
die Abfrage :
SELECT t1.ind,t1.w1, t2.ind,t2.w2,t2.d, t3.ind,t3.w3,t3.d
FROM t2
FULL JOIN t3 ON t2.ind = t3.ind AND t2.d = t3.d
RIGHT JOIN t1 ON (( t1.ind = t2.ind) OR (t1.ind = t3.ind))

liefert das erwuenschte Ergebniss.

(Und natuerlich war der mitgeteilte SQL-Text fehlerhaft.
Es muss xx.ind und nicht xx.pa heissen.)

Lambros