2 Felder mit 2 Felder aus anderer Tabelle vergleichen

2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 30.07.2007 12:52:49 von Michael Kuroll

Hallo wiedermal dcdm!

Irgendwie will mein Brett vor den Augen nicht verschwinden.
Folgende Ausgangssituation:

2 identische Tabellen sega und aldente.
Darin jeweils 2 Felder 'aso1' und 'aso02' (jeweils varchar).

Ich benötige alle Datensätze der Tabelle aldente die NICHT in der Tabelle
sega vorhanden sind (Vergleich nur über die 2 oben genannten Felder).

Mein Ansatz wäre:

SELECT DISTINCT aldente.as01, aldente.as02
FROM `aldente_mugaas` aldente , sega_mugaas sega
WHERE sega.as01 != aldente.as01
AND sega.as02 != aldente.as02

Allerdings scheint das nicht ordnungsgemäß zu funktionieren, ich erhalte
auch Datensätze die in beiden Tabellen vorhanden sind.

Kann mir bitte jemand sagen wo mein Denkfehler liegt?

Tabellenstruktur ist mir leider so vorgegeben.
MySQL Version: 5.0.32

Vielen Dank, lg
Mike

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 30.07.2007 13:13:26 von Dirk Brosowski

Michael Kuroll schrieb:
> Hallo wiedermal dcdm!
>
> Irgendwie will mein Brett vor den Augen nicht verschwinden.
> Folgende Ausgangssituation:
>
> 2 identische Tabellen sega und aldente.
> Darin jeweils 2 Felder 'aso1' und 'aso02' (jeweils varchar).
>
> Ich benötige alle Datensätze der Tabelle aldente die NICHT in der Tabelle
> sega vorhanden sind (Vergleich nur über die 2 oben genannten Felder).
>
> Mein Ansatz wäre:
>
> SELECT DISTINCT aldente.as01, aldente.as02
> FROM `aldente_mugaas` aldente , sega_mugaas sega
> WHERE sega.as01 != aldente.as01
> AND sega.as02 != aldente.as02
>
> Allerdings scheint das nicht ordnungsgemäß zu funktionieren, ich erhalte
> auch Datensätze die in beiden Tabellen vorhanden sind.
>
> Kann mir bitte jemand sagen wo mein Denkfehler liegt?
>
> Tabellenstruktur ist mir leider so vorgegeben.
> MySQL Version: 5.0.32
>
> Vielen Dank, lg
> Mike


Der Denkfehler ist ganz klar, du erzeugst ein Kreuzprodukt und nimmst
nur wenige Datensätze raus. Ohne Distinct wären das richtig viele
Datensätze ;)

Dein Problem wird sich lösen, wenn du einen Join machst, welcher Join
(es gibt Outer, Inner, Self) der richtige ist, findest du in
verschiedenen Dokumentationen dazu. Also einfach mal danach googeln und
dann wirst du dir am besten selbst helfen können.

Grüße

Dirk

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 30.07.2007 13:18:35 von Dietmar Staritz

Das was Dir fehlt ist EXISTS:

select ..
from tab1
where
exists (select ... from tab2 where tab1.spalte1 =tab2.spalte2 ..)

oder u.U. ne MINUS (wie UNION)
SELECT ..
MINUS
SELECT ..
wenn:
MySQL das inzwischen hat ??

Bis denne

Dietmar


(mal schnell aus dem Handgelenk ohne Buch und Test ;o)

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 30.07.2007 13:28:57 von Claus Reibenstein

Michael Kuroll schrieb:

> Ich benötige alle Datensätze der Tabelle aldente die NICHT in der Tabelle
> sega vorhanden sind (Vergleich nur über die 2 oben genannten Felder).

Du suchst LEFT JOIN.

Gruß. Claus

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 30.07.2007 13:57:40 von Dietmar Staritz

> oder u.U. ne MINUS (wie UNION)
> SELECT ..
> MINUS
> SELECT ..
> wenn:

MINUS gibts nicht unter MySQL ,aber so sollte es werden:

SELECT aldente.as01, aldente.as02
FROM `aldente_mugaas` aldente
WHERE NOT EXISTS
(SELECT 1 FROM sega_mugaas sega
WHERE sega.as01 = aldente.as01
AND sega.as02 = aldente.as02)

eventuell sollte auch folgendes klappen:

select test.* from
(SELECT aldente.as01 a1, aldente.as02 a2, sega.as01 a3
FROM 'aldente_mugaas' aldente LEFT JOIN 'sega_mugaas' sega
USING (as01,as02)) as test
WHERE test.a3 IS NULL


oder
WHERE NOT IN (Select as01..

Such dir die dir genehme Varinate aus ..

Dietmar

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 30.07.2007 21:03:09 von Michael Kuroll

Am Mon, 30 Jul 2007 13:57:40 +0200 schrieb Dietmar Staritz:

> SELECT aldente.as01, aldente.as02
> FROM `aldente_mugaas` aldente
> WHERE NOT EXISTS
> (SELECT 1 FROM sega_mugaas sega
> WHERE sega.as01 = aldente.as01
> AND sega.as02 = aldente.as02)

Danke das funktioniert super!

lg
Mike

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 30.07.2007 21:03:55 von Michael Kuroll

Am Mon, 30 Jul 2007 13:28:57 +0200 schrieb Claus Reibenstein:

>> Ich benötige alle Datensätze der Tabelle aldente die NICHT in der Tabelle
>> sega vorhanden sind (Vergleich nur über die 2 oben genannten Felder).

> Du suchst LEFT JOIN.

Diese Joins hab ich noch nie so ganz kapiert - wenn da wer ne brauchbare
Erkärung dafür hat wär ich sehr dankbar.
Trotzdem Danke.

lg
Mike

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 31.07.2007 11:12:21 von Daniel Fischer

Michael Kuroll!

> Diese Joins hab ich noch nie so ganz kapiert - wenn da wer ne brauchbare
> Erkärung dafür hat wär ich sehr dankbar.

Doch doch, kommt in dieser Gruppe regelmaessig vor.
Also nochmal zum Mitschreiben:

Zwei Tabellen, `eins` und `zwei`, mit jeweils einer Spalte `buchstabe`,
mit folgendem Inhalt:

eins: a b c e
zwei: b c d f

Ein JOIN ist jetzt ein Kreuzprodukt aus den beiden Tabellen, also die
Menge aller Tupel, die aus den Buchstaben aus beiden Tabellen gebildet
werden kann:

SELECT buchstabe FROM eins JOIN zwei;

a b c e
b (a b), (b b), (c b), (e b),
c (a c), (b c), (c c), (e c),
d (a d), (b d), (c d), (e d),
f (a f), (b f), (c f), (e f)

Im Bild ist die erste (linke) Tabelle oben, und die zweite (rechte) an der
Seite. Der Inhalt der Matrix sind die eben erwähnten Tupel aus allen
Datensätzen beider Tabellen.

Jetzt will man aber vielleicht nicht alle diese Tupel haben, sondern nur
bestimmte, beispielsweise alle, die in `eins` und `zwei` den selben
Buchstaben haben:

SELECT buchstabe FROM eins JOIN zwei ON eins.buchstabe = zwei.buchstabe;

a b c e
b (b b),
c (c c)
d
f

In dem Beispiel bleiben damit nur noch zwei Tupel übrig.

Bei einem LEFT JOIN habe ich zusätzlich die Garantie, dass jeder
Datensatz aus der ersten (linken) Tabelle im Ergebnis vorkommt. Wenn nach
Anwendung der ON-Klausel kein Tupel gefunden werden kann, dann tauchen
solche Datensätze im Ergebnis mit dem zweiten Wert NULL auf:

SELECT buchstabe FROM eins JOIN zwei ON eins.buchstabe = zwei.buchstabe;

a b c e
b (b b),
c (c c),
d
f
(a, NULL), (e, NULL)

Das kannst du jetzt wieder dazu verwenden, um alle Datensätze zu finden,
die in der zweiten Tabelle nicht existieren: Das sind die, die als zweiten
Wert eben NULL haben.

SELECT eins.buchstabe
FROM eins JOIN zwei ON eins.buchstabe = zwei.buchstabe
WHERE zwei.buchstabe IS NULL;

Das Bild dafür spare ich mir mal, und auf deine Anwendung
umstricken kannst du es vermutlich auch selbst...


Gruß
Daniel

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 31.07.2007 12:19:58 von Claus Reibenstein

Daniel Fischer schrieb:

> Bei einem LEFT JOIN [...]
>
> SELECT buchstabe FROM eins JOIN zwei ON eins.buchstabe = zwei.buchstabe;
^^^^

Wenn Du LEFT JOIN meinst, musst Du hier auch LEFT JOIN hinschreiben.

> Das kannst du jetzt wieder dazu verwenden, um alle Datensätze zu finden,
> die in der zweiten Tabelle nicht existieren: Das sind die, die als zweiten
> Wert eben NULL haben.
>
> SELECT eins.buchstabe
> FROM eins JOIN zwei ON eins.buchstabe = zwei.buchstabe
^^^^

Hier auch.

Gruß. Claus

Re: 2 Felder mit 2 Felder aus anderer Tabelle vergleichen

am 01.08.2007 22:02:31 von Daniel Fischer

Claus Reibenstein!

> Wenn Du LEFT JOIN meinst, musst Du hier auch LEFT JOIN hinschreiben.

Oh, da will man mal was schreiben, was nicht nur direkt per copy&paste
übernommen werden kann, und dann sowas... du hast natürlich recht, die
letzten beiden müssen LEFT JOIN stehen haben, wie's im Text dazu auch
steht.


Gruß
Daniel