joni2000de
Goto Top

SQL Tabellen verbinden mit nur teilweise Daten

Hi Admins,

ich bin auf dem Datenbankgebiet noch ganz frisch unterwegs und zähle auf eure Hilfe face-smile

Ich habe eine Tabelle die ich mit einer anderen verknüpfen möchte. In der Ausgangstabelle sind 2 Werte vorhanden die jeweils die ID des Kontos und des Gegenkontos enthalten. In der 2. Tabelle sind die Kontobezeichnungen der jeweiligen ID zugeordnet. Im Ergebnis sollen die Daten der Tabelle 1 mit den Kontobezeichnungen der Tabelle 2 ergänzt werden. Das ist ja alles noch kein Problem. Doch in der Tabelle 1 kann es sein, dass das Gegenkonto keinen Wert enthält und nur eine ID für das Konto vorhanden ist. Wenn ich jetzt die Verknüpfung für das Konto und eine 2. Verknüpfung für das Gegenkonto vornehme werden nur noch die Datensätze ausgegeben die im Feld Gegenkonto eine ID enthalten. Ich hätte aber gerne alle Datensätze und wenn keine ID für das Gegenkonto vorhanden ist sollte die Kontobezeichnung für das Gegenkonto einfach leer bleiben. So in der Art

Wenn ID-Gegenkonto vorhanden dann hole die Kontobezeichnung ansonsten tue nichts

Wie gesagt, das ist noch absolutes Neuland für mich und ich bin über jede Hilfe dankbar.

Schöne Grüße
Joni

Content-ID: 156534

Url: https://administrator.de/contentid/156534

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

Biber
Biber 07.12.2010 um 20:39:02 Uhr
Goto Top
Moin joni2000de,

wenn du noch ganz frisch bist auf dem Datenbankgebiet, dann gleich die wichtigste Lektion:

Fragen zu SQL lasssen sich nur beantworten, wenn ein bestimmtes (=namentlich genanntes) Datenbankblech drunterliegt.

Was du brauchst ist ein so genannter LEFT JOIN (alle Sätze aus der linken, zuerst erwähnten tabelle anzeigen plus die Werte aus der als zweites genannten Tabelle, sofern vorhanden).

Aber selbst ein LEFT JOIN - Statement kann je nach DBMS (Oracle, mySQL, PostGreSQL,....) klitzekleine Syntaxunterschiede haben.

Grüße
Biber
joni2000de
joni2000de 08.12.2010 um 23:57:19 Uhr
Goto Top
Hi Biber,

dann mal gleich zum wichtigsten => Oracle 10g

Ich hab mich da mal etwas schlau gemacht bezüglich Left Join, doch das will noch nicht so ganz. Hier ist das SQL Statement (mein erster Versuch wie oben beschrieben):

SELECT BK.ONR, KONTO.KONTONUMMER, KONTO.KONTONAME, KONTO_1.KONTONUMMER, KONTO_1.KONTONAME, BKO.BNUMMER, BUP.TEXT, BUP.BART, BUP.SH, BUP.NBETRAG, BUP.SBETRAG, BUP.STEUER, BUP.WS

FROM DB1.BKO BKO, DB1.BK BK, DB1.BUP BUP, DB1.KONTO KONTO, DB1.KONTO KONTO_1

WHERE KONTO.ID = BUP.KONTOID AND BK.ID = KONTO.BKID AND BKO.ID = BUP.BKOID AND KONTO_1.ID = BUP.GEGENKONTOID AND ((BK.ONR=1410) AND (BUP.WERTSTELLUNG>={ts '2010-01-01 00:00:00'} And BUP.WERTSTELLUNG<={ts '2010-01-31 00:00:00'}))

Konto und Konto_1 ist die gleiche Tabelle. Ich habe jetzt probiert den Teil AND KONTO_1.ID = BUP.GEGENKONTOID aus dem WHERE Teil zu löschen und dafür zwischen FROM und WHERE folgendes eingefügt

LEFT JOIN DB1.BUP BUP on BUP.GEGENKONTOID = KONTO_1.ID

doch dann erhalte ich die Meldung, dass die Spaltenbezeichnung nicht eindeutig ist?? Muss ich in dem Fall die Tabelle Konto nur einmal angeben?

Ich hoffe das hilft weiter, ich dreh mich da momentan etwas im Kreis.

Gruß Joni
MadMax
MadMax 09.12.2010 um 12:41:35 Uhr
Goto Top
Moin Joni,

Oracle bietet beim left join eine spezielle Schreibweise an, nämlich ein (+) hinter die Spalte, die zu der entsprechenden Tabelle gehört,das wäre bei Dir dann
... AND KONTO_1.ID(+) = BUP.GEGENKONTOID AND ...

Sauberer wäre allerdings die allgemein gültige Schreibweise
SELECT BK.ONR, KONTO.KONTONUMMER, KONTO.KONTONAME, KONTO_1.KONTONUMMER, KONTO_1.KONTONAME, BKO.BNUMMER, BUP.TEXT, BUP.BART, BUP.SH, BUP.NBETRAG, BUP.SBETRAG, BUP.STEUER, BUP.WS

FROM	DB1.BKO BKO
	join DB1.BUP BUP on BKO.ID = BUP.BKOID
	join DB1.KONTO KONTO on KONTO.ID = BUP.KONTOID
	join DB1.BK BK on BK.ID = KONTO.BKID
	left join DB1.KONTO KONTO_1 on KONTO_1.ID = BUP.GEGENKONTOID

WHERE  ((BK.ONR=1410) AND (BUP.WERTSTELLUNG>={ts '2010-01-01 00:00:00'} And BUP.WERTSTELLUNG<={ts '2010-01-31 00:00:00'}))  

Die Tabellenverküpfungen also raus aus dem where und die ganzen Tabellen mit join verbunden.

Gruß, Mad Max
joni2000de
joni2000de 09.12.2010 um 14:34:59 Uhr
Goto Top
Hi Max,

danke das hat funktioniert. Jetzt würde ich gerne die Spaltenüberschrift ändern. Doch das will nicht. Müsste das nicht mit

SELECT BK.ONR as NUMMER, ...
funktionieren?

Nochmal danke für eure Hilfe.
Gruß Joni
MadMax
MadMax 10.12.2010 um 12:50:34 Uhr
Goto Top
Ja, Joni, genau so funktioniert das face-smile
joni2000de
joni2000de 10.12.2010 um 19:16:03 Uhr
Goto Top
Hi Max,

das will aber nicht. Wenn ich eine einfach Abfrage schreibe, dann klappt es. Aber in meiner Abfrage nicht?????

Wie kann ich der Sache auf den Grund gehen?

Gruß Joni
Biber
Biber 11.12.2010 um 00:06:03 Uhr
Goto Top
Moin joni2000de,

Zitat von @joni2000de:
das will aber nicht. Wenn ich eine einfach Abfrage schreibe, dann klappt es. Aber in meiner Abfrage nicht?????

Wie kann ich der Sache auf den Grund gehen?
Du könntest diese bockige Abfrage mal anderen Leuten zeigen...
Vielleicht fällt denen etwas ein oder auf und somit auch etwas für dich ab.

Grüße
Biber
joni2000de
joni2000de 13.12.2010 um 18:22:13 Uhr
Goto Top
Hi Biber,

die bockige Abfrage ist die obige saubere Variante von Max. Sorry ich dachte das ist klar face-sad

Gruß Joni
MadMax
MadMax 13.12.2010 um 21:05:18 Uhr
Goto Top
Moin Joni,

an der Abfrage hast Du aber wohl noch rumgeschraubt, zumindest stand im Original nichts von "as NUMMER" oder sowas. Also bitte die Abfrage, die die Probleme bereitet. Und wenns geht, auch der Fehler, der auftritt. "das will aber nicht" ist ein bisschen zu ungenau.

Gruß, Mad Max
joni2000de
joni2000de 14.12.2010 um 00:03:33 Uhr
Goto Top
Hi Max, hi Biber,

nochmal ganz langsam.

Die obige Abfrage 1:1 funktioniert problemlos.

Wenn ich dann statt SELECT BK.ONR, KONTO.KONTONUMMER... die Abfrage auf SELECT BK.ONR as NUMMER, KONTO.KONTONUMMER... abändere damit die Spalte nicht ONR sondern Nummer heißt passiert folgendes:

In MS Query wird einfach der Teil as Nummer aus der Abfrage gelöscht und diese dann "normal" durchgeführt => keine Fehlermeldung aber die Spalte heißt immer noch ONR.

Ich habe gerade die Abfrage in ein Excelmakro übertragen (wo sie schlussendlich auch hin muss) und da funktioniert das mit dem Umbenennen face-smile
Warum MS Query hier so herumzickt weiß ich nicht. Ist mir im Moment auch egal Hauptsache es funktioniert. Hätte ich doch lieber gleich mal probiert.

Auf jeden Fall nochmal danke an euch beide!

Gruß Joni