Zwei Tabellen vergleichen: LEFT JOIN Problem

MrWolf

Benutzer
Beiträge
11
Guten Tag,

Ich dachte, es ist ein einfaches Problem zwei Tabellen zu vergleichen und das Datenfeld anzuzeigen, welches ungleich ist. Nun bekomme ich bei der Abfrage nur jeweils die Tabellennamen ohne Daten ausgegeben?

SELECT auftr.*, Kont.Gr0 FROM auftr
LEFT JOIN Kont ON auftr.Gr0 = Kont.Gr0
WHERE Kont.Gr0 <> auftr.Gr0

Wäre super, wenn mir jemand den Fehler aufzeigen könnten, nach dem ich schon eine Ewigkeit suche.
 
Werbung:
Während ein Left-Join nur 1:1 übereinstimmende anzeigt, und die where klausel aber unterschiedliche filtert, wird nichts angezeigt.

lass einfach mal das where weg...

EDIT: (Beispielcode)
Code:
postgres=# create table auftrag(id int, name text);
CREATE TABLE
postgres=# create table konto(id int, nummer text);
CREATE TABLE
postgres=# insert into auftrag(id, name) values (1, 'Hans');
INSERT 0 1
postgres=# insert into konto(id, nummer) values (1, '1234');
INSERT 0 1
postgres=# select auftrag.*, konto.nummer from auftrag left join konto on (konto.id = auftrag.id);
 id | name | nummer
----+------+--------
  1 | Hans | 1234
(1 Zeile)
 
Zuletzt bearbeitet:
auftr.Gr0 = Kont.Gr0
und
Kont.Gr0 <> auftr.Gr0
widerspricht sich übrigens rein logisch betrachtet schon.

Nein hier gibt's kein "erledigt", leider :-)
 
Darüber muss ich jetzt nachdenken. Nach meiner Überlegung bedeutet '=' gleicher Datensatz und '<>' unterschiedlicher. Oder habe ich wieder etwas übersehen?
 
Pardon, muss mich doch noch einmal melden: Ohne 'Where' bekomme ich alle Felder angezeigt, die sich nicht unterscheiden. Ich möchte aber den Datensatz, der sich unterscheidet. Was muss ich dafür an dem Code ändern?
Mit 'Where' dagegen müsste ich wieder alle 30 Felder anführen.
 
Der left join spuckt nur Datensätze aus, die entweder identisch sind oder wo der passende Wert / Datensatz rechts fehlt. Folglich ist dort das Feld NULL.
Die Where Condition mit <> (ungleich, was auch immer), erfasst das nicht. Sie könnte maximal (normaler Anwendungsfall) auf IS NULL prüfen.
 
Danke an alle für den freundlichen Beistand. Ich glaube, ich kann mich von der Idee trennen, es mit mysql zu lösen. Ich werde auf das gute alte PHP zurückgreifen, die Daten in zwei Arrays laden und diese dann einfach vergleichen. Der Programmablauf dauert mit dieser Methode zwar länger, aber ich komme damit sicher zum gewünschten Ergebnis. Nochmals vielen Dank an alle.
 
Ist damit der Eintrag von 'ukulele' gemeint? Wie ich nachträglich gemerkt hatte, habe ich es zumindest nicht so verstanden, wie er es gemeint hat. Aber wenn es mich bei meinem Problem weiterbringt, so bin ich für jede Aufklärung dankbar

 
Ist damit der Eintrag von 'ukulele' gemeint? Wie ich nachträglich gemerkt hatte, habe ich es zumindest nicht so verstanden, wie er es gemeint hat. Aber wenn es mich bei meinem Problem weiterbringt, so bin ich für jede Aufklärung dankbar

2 Dinge können nicht gleichzeitig gleich und ebenso gleichzeitig ungleich sein. Ist kompliziert, gell?
 
Na gut. Wenn ich mich jetzt sehr anstrenge, dann verstehe das möglicherweise sogar. Aber welcher Operator wäre dann der richtige?
Wenn Du einfach mal ein nachvollziehbares Beispiel geben könntest ...

Code:
postgres=# create table wolf1(id int primary key, data int);
CREATE TABLE
postgres=# create table wolf2(id int primary key, data int);
CREATE TABLE
postgres=# insert into wolf1 values (1,1);
INSERT 0 1
postgres=# insert into wolf1 values (2,2);
INSERT 0 1
postgres=# insert into wolf1 values (3,3);
INSERT 0 1
postgres=# insert into wolf2 values (1,1);
INSERT 0 1
postgres=# insert into wolf2 values (2,22);
INSERT 0 1
postgres=# insert into wolf2 values (3,3);
INSERT 0 1
postgres=# select * from wolf1 inner join wolf2 using (id) where wolf1.data != wolf2.data;
 id | data | data 
----+------+------
  2 |    2 |   22
(1 row)

postgres=#
 
Werbung:
Darüber muss ich jetzt nachdenken. Nach meiner Überlegung bedeutet '=' gleicher Datensatz und '<>' unterschiedlicher. Oder habe ich wieder etwas übersehen?
Ja natürlich und nichts auf der Welt kann gleichzeitig = und <> sein, das steht da aber so. Die Reihenfolge ist aber unerheblich. Du sagst im Prinzip x = y und y <> x, es gibt also nie einen Datensatz der die Bedingungen erfüllt. okay in diesem Fall gibt es eventuell Datensätze wo kein LEFT JOIN statt finden kann, dann kann die WHERE Bedingung erfüllt werden. Aber ich denke mal das ist nicht dein Ziel.

Pardon, muss mich doch noch einmal melden: Ohne 'Where' bekomme ich alle Felder angezeigt, die sich nicht unterscheiden. Ich möchte aber den Datensatz, der sich unterscheidet. Was muss ich dafür an dem Code ändern?
Mit 'Where' dagegen müsste ich wieder alle 30 Felder anführen.
Erstmal musst du zwangsläufig die Datensätze auf der Basis der ID joinen, sonst findest du natürlich jede Menge Datensätze die nicht gleich sind. Du kannst also einen JOIN auf den Primärschlüssel machen und alle Daten-Spalten dann im WHERE-Teil vergleichen. Vermutlich müsste das dann etwa so aussehen:
Code:
SELECT * FROM auftr
INNER JOIN Kont ON auftr.Gr0 = Kont.Gr0
WHERE auftr.spalte1 <> Kont.spalte1
OR auftr.spalte2 <> Kont.spalte2
OR auftr.spalte3 <> Kont.spalte3
...

Wenn die beiden Tabellen wirklich identisch sind von den Spalten und Datentypen her geht natürlich auch EXCEPT:
Code:
SELECT * FROM auftr
EXCEPT
SELECT * FROM Kont
 
Zurück
Oben