Daten aus zwei Tabellen nebeneinander darstellen

Hallo!
Ich habe ein Problem eine bestimmte Abfrage zu bauen (MS-SQL, Tests in Query Analyzer Version SQL 8.00.194)

Und zwar habe ich zwei Tabellen folgender Struktur:

Tabelle1:
Tab_ID Vertragsnummer Text
001 123xyz Textirgendwas1
002 768abc NocheinText2

Tabelle2:
Vertragsnummer Zahlung Datum
123xyz 1,50 01.01.2006
768abc 2,50 03.01.2006
768abc 8,88 02.01.2006
123xyz 2,00 14.01.2006
897jhf 2,20 05.01.2006

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:

001 123xyz Textirgendwas1 2,00 14.01.2006
002 768abc NocheinText2 2,50 03.01.2006

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.

Kann mir jemand helfen?

Hallo Cleg!

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.

Gruß
Martin

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]

Hi Martin!

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 …

Hallo Tom!

Lange nichts gehört (und auf ein Bier waren wir auch immer noch nicht :wink:!

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 …

Wieso? Hab’ ich was verpasst?

Gruß
Martin