SQL Knacknuss

PH

Legendäres Mitglied
Da ich nun ratlos bin, wäre ich für Hilfe zur folgenden Aufgabe dankbar:

Ich habe 2 Tabellen, Table1 und Table2. Ich möchte beide Tabellen über eine Spalte (=joinspalte) wie folgt joinen:

Auf Deutsch: wenn table1.joinspalte mit table2.joinspalte übereinstimmt, dann diesen join nehmen. Wenn nicht, dann prüfen, ob concat(substr(table1.joinspalte,0,5),'000') mit table2.joinspalte übereinstimmt, wenn ja, dann diese nehmen.

Ich habe das so auf SQL übersetzt: (Oracle 9)

CODE WHERE (table1.joinspalte = table2.joinspalte OR (table1.joinspalte != table2.joinspalte AND concat(substr(table1.joinspalte,0,5),'000') = table2.joinspalte))


Logisch gesehen sollte es keine Fälle geben, wo beide Seiten des OR zutreffen. Aber Oracle gibt trotzdem jede Zeile doppelt aus??

Hilfe ???
 
Bei mir gibts da keine doppelten, ich krieg überhaupt nur eine Zeile als Resultat. Das liegt wohl daran dass ich nicht dieselben Daten habe wie Du, ich hab nur testhalber ein paar Zeilen erfasst. Auf jeden Fall hab ich die Klammern etwas abgeändert, aber ich glaub nicht dass das Problem damit wirklich behoben ist.

CODE select t1.joinspalte, t1.beispiel, t2.joinspalte, t2.beispiel2
from table1 t1, table2 t2
where (t1.joinspalte = t2.joinspalte) OR
((t1.joinspalte != t2.joinspalte) AND (concat(substr(t1.joinspalte,0,5),'000') = t2.joinspalte))

Zum Nachvollziehen müsst man jetzt wissen, mit was für Daten das Problem auftritt.

Griessli
Irene
 
Danke Irene, hast du auch Oracle?

Daten wären z.B. wie folgt:

tabelle1:
refnr
01225100
01225000
01225300
01225200
01228100
01229100

tabelle2:
refnr, text
01225100, text
01225000, text
01225200, text
01228100, text
01229000, text

Query:
Select tabelle1.refnr,tabelle2.text,tabelle2.refnr from tabelle1, tabelle2 where
tabelle1.refnr = tabelle2.refnr OR tabelle1.refnr != tabelle2.refnr and concat(substr(tabelle1.refnr,0,5),'000') = tabelle2.refnr

Erwartete Ausgabe:
01225100, text, 01225100
01225000, text, 01225000
01225300, text, 01225000
01225200, text, 01225200
01228100, text, 01228100
01229100, text, 01229000

Effektive Ausgabe:
01225100, text, 01225100
01225100, text, 01225000
01225000, text, 01225000
01225000, text, 01225000
usw.

Aber das Problem ist nicht mehr aktuell, da ich jetzt auf eine alternative Lösung ausgewichen bin.

Jedenfalls vielen Dank an Irene für die Hilfe.
 
Jo ich hab auch Oracle. Aber ich benutz es nur in Projekten, wo es vom Kunden explizit vorgeschrieben ist ;-)

Mit Deinen Daten konnt ichs nachvollziehen. Oracle behandelt das OR anscheinend als nicht explizites OR, sondern so ungefähr wie ein "oder auch". Lösen konnt ichs auf die Schnelle nur mit einem hässlichen Konstrukt

CODE select t1.refnr,
nvl(t2.refnr,(select t2a.refnr from table2 t2a where concat(substr(t1.refnr,0,5),'000')=t2a.refnr )) t2_refnr,
nvl(t2.text,(select t2a.beispiel2 from table2 t2a where concat(substr(t1.refnr,0,5),'000')=t2a.refnr )) t2_text
from table1 t1, table2 t2
where t1.refnr = t2.refnr(+)

Deine alternative Lösung dürfte auf jeden Fall besser sein ;-)

Griessli
Irene
 
yup - ich hätte Deine Lösung nicht anwenden können. Zum einen benutze ich das (+) bereits in einem anderen Join, und ausserdem handelt es sich in dem von mir als Problem beschrieben Join 'nur' um ein join zwischen einer tabelle mit ein Paar millionen Einträgen, 300 Spalten und der Table2, die nur 300k Einträge und 50 Spalten hat :-\

Ich bin froh, eine alternative Lösung gefunden zu haben, LOL.
dry.gif
 
Zurück
Oben