Anmelden

View Full Version : sql join mit distinct o.ä.



Robi
31-07-15, 12:52
Moin *all
ich habe

select a.f1, c.f3 from datei1 a
left outer join datei2 b on a.key1 = b.key2
left outer join datei3 c on b.feld = c.feld

brauche also Daten aus Datei 1 und 3
Zur Verknüpfung von 1 und 3 muss ich über datei2 gehen.

Diese hat aber ab und an mehrere Sätze die zu Datei1 passen.
Wie kann ich die Verknüpfung auf einen Satz reduzieren
Es ist 100% sicher, das FELD in allen Datensäzen eine Gruppe in datei 2 immer gleich ist.
Bsp



Datei 1, key1 Feld F3
11111111
22222222
33333333
Datei 2 11111111 A
33333333 B
33333333 B
Datei 3
A 5
B 7

Soll Ergebnis 11111111 5
22222222
33333333 7

ist Ergebnis 11111111 5
22222222
33333333 7
33333333 7


Einer ne Idee?

Danke
Gruß
Robi

Robi
31-07-15, 14:03
Ich hab es erstmal so gelöst, aber gibt es nix besseres?

with x as (select distinct key2, feld from datei2)
select a.f1, c.f3 from datei1 a
left outer join x on a.key1 = x.key2
left outer join datei3 c on x.feld = c.feld

Danke

Fuerchau
31-07-15, 14:17
Nö, nur andere Schreibweisen:

left join (select key2, min(Feld) feld from datei2 Group by key2) on key1=key2

Könnte ggf. schneller sein.

Nächste Alternative:
with x as (
select f1, f3
, (select Feld from datei2 where key1 = key2 fetch first 1 rows only) feld
from date1)

select * from x
left join datei3 c on x.feld = c.Feld

Falls bei dir der Fetch first an dieser Stelle noch nicht geht (ab V6), dann hilft hier ggf. ein Distinct oder Min(), falls "Feld" nicht eindeutig.

B.Hauser
01-08-15, 15:47
Vielleicht sehe ich das Problem nicht, aber warum machst du nicht einfach einen SELECT DISTINCT?


select DISTINCT a.f1, c.f3 from datei1 a
left outer join datei2 b on a.key1 = b.key2
left outer join datei3 c on b.feld = c.feld

Perfomancemäßig könnte es sein, dass die Variante mit der Common Table Expression bzw. dem verschachtelten Sub-Select in der From-Anweisung ein schnelleres Ergebnis liefern.
Das müsste man über Visual Explain analysieren.

Birgitta

Fuerchau
02-08-15, 17:13
Meine Erfahrung zu Distinct ist eher eine Verlangsamung, da ja alle Daten gelesen werden müssen.

B.Hauser
02-08-15, 17:24
... da ja alle Daten gelesen werden müssen.

Noch nicht mal in alter Zeit (allenfalls in ganz alter Zeit so Release 4) war das so, dass beim Distinct alle Daten gelesen werden müssen.
Dass die Daten komplett gelesen werden müssen, ist entweder eine Vermutung oder eine falsche Indexing Strategy.

Mit dem richtigen Index kann ein IOA (Index Only Access) mit Index-Probe (bzw. CQE Index Key Positioning) oder notfalls Index-Scan erfolgen.

Ohne genaue Analyse kann man nicht mehr sagen .
... Ich hatte ja auch "könnte" und außerdem "analysieren" geschrieben!

Birgitta