Nun möchte ich eine Übersicht aller Daten aus Tabelle1 erzeugen,
in der an jeder Vertragszeile der aktuellste zugehörige Datensatz aus Tabelle2 angehängt ist.
Das Resultset müsste dann folgendermaßen aussehen:
Zu beachten ist, dass in Tabelle2 Verträge gelistet sind, die in Tabelle1 nicht mehr vorkommen.
Mit einem Datensatz aus Tabelle1 bekomme ich das ja noch hin:
select top 1 a.*,b.*
from Tabelle1 a inner join Tabelle2 b
on a.vertragsnummer = b.vertragsnummer
where a.vertragsnummer = ‚123xyz‘
order by b.Datum desc
Aber wie macht man das mit einem ganzen Suchergebnis?
Distinct funktioniert ja leider nicht bei mehreren unterschiedlichen Spalten.
Habe schon alle Join-Optionen durchprobiert sowie mit Group-by experementiert, hat auch nicht geklappt.
Unter Oracle würde ich das auf die Schnelle so schreiben (den Umbau auf MS-SQL-Syntax überlasse ich dir):
SELECT * FROM t1, t2 WHERE t1.vertragsnummer = t2.vertragsnummer AND t2.datum IN (SELECT MAX(datum) FROM t2 sub_t2 WHERE sub_t2.vertragsnummer=t2.vertragsnummer);
oder alternativ
SELECT * FROM t1, t2 WHERE t1.vertragsnummer = t2.vertragsnummer AND (t2.vertragsnummer,t2.datum) IN (SELECT vertragsnummer, MAX(datum) FROM t2 GROUP BY vertragsnummer);
Es gibt da aber noch ein paar Varianten (z.B. mit inline views oder „not exists“), musst halt ausprobieren, was dein optimizer am besten auflöst.
select T1.Tab_ID,
T1.Vertragsnummer,
T1.Text,
T2.Zahlung
T2.Datum
from
Tablle1 T1 ,Tablle2 T2
where T1.Vertragsnummer=T2.Vertragsnummer
and T2.datum=(select max(TL2.Datum) from Tabelle2 TL2 where
TL2.Vetragsnummer=T2.Vetragsnummer)
oder
select O1,*,O2.* frim Tabelle1 O1, Tabelle2 O2
select O1.Tab_ID,
O1.Vertragsnummer,
O1.Text,
O2.Zahlung
O2.Datum
from Tabelle1 O1, Tablle2 O2
where O1.Vetragsnummer=O2.Vertragsnummer
and (O1.vertragsnummer,O2.datum) in
(
select
T1.Vertragsnummer,
Max(T2.Datum)
from
Tablle1 T1 ,Tablle2 T2
where T1.Vertragsnummer=T2.Vertragsnummer
group by T1.Tab_ID,T1.Vertragsnummer, T1.Text
)
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
SELECT * FROM t1, t2 WHERE t1.vertragsnummer =
t2.vertragsnummer AND t2.datum IN (SELECT MAX(datum) FROM t2
sub_t2 WHERE sub_t2.vertragsnummer=t2.vertragsnummer);
oder alternativ
SELECT * FROM t1, t2 WHERE t1.vertragsnummer =
t2.vertragsnummer AND (t2.vertragsnummer,t2.datum) IN (SELECT
vertragsnummer, MAX(datum) FROM t2 GROUP BY vertragsnummer);
Es gibt da aber noch ein paar Varianten (z.B. mit inline views
oder „not exists“), musst halt ausprobieren, was dein
optimizer am besten auflöst.
Ohne es auszuprobieren: Having-Klausel? Würde es a) funktionieren und b) das ganze performanter machen?
Grüße,
Tomh
… ich bin nach dem heutigen Tag nicht mehr in der Lage, auch nur irgendetwas in Oracle auszutüfteln …
Lange nichts gehört (und auf ein Bier waren wir auch immer noch nicht !
SELECT * FROM t1, t2 WHERE t1.vertragsnummer =
t2.vertragsnummer AND (t2.vertragsnummer,t2.datum) IN (SELECT
vertragsnummer, MAX(datum) FROM t2 GROUP BY vertragsnummer);
Es gibt da aber noch ein paar Varianten (z.B. mit inline views
oder „not exists“), musst halt ausprobieren, was dein
optimizer am besten auflöst.
Ohne es auszuprobieren: Having-Klausel? Würde es a)
funktionieren und b) das ganze performanter machen?
Kommt darauf an: a) Was genau meinst du? b) Wie sehen die Daten aus? Bzw. wie dein Namensvetter Kyte sagen würde: ausprobieren!
… ich bin nach dem heutigen Tag nicht mehr in der Lage, auch
nur irgendetwas in Oracle auszutüfteln …