Alle Daten aus Tabelle1 die nicht in Tabelle2 vorkommen

Alle Daten aus Tabelle1 die nicht in Tabelle2 vorkommen

am 31.07.2007 17:34:00 von RBTMEKRDQKDL

Hallo,

ich habe zwei Tabellen mit exakt der selben Struktur. Auch der Inhalt
ist sich sehr ähnlich. Nun möchte ich herausfinden wo sich die
Tabellen unterscheiden. Hierzu brauche ich ein SQL-Statement das mir
die Zeilen Anzeigt die zwar in Tabelle1 aber nicht in Tabelle2
vorkommen.

Eigentlich kommt mir die Frage schon fast zu einfach vor aber
irgendwie bekomme ich immer nur die Schnittmenge bzw. das Kreuzprodukt
raus. Bitte helft mir meinen Hirnknoten zu entwirren.

Viele Grüße
Ray

Re: Alle Daten aus Tabelle1 die nicht in Tabelle2 vorkommen

am 31.07.2007 18:06:15 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Alle Daten aus Tabelle1 die nicht in Tabelle2 vorkommen

am 31.07.2007 20:28:06 von Oliver Lehmann

RBTMEKRDQKDL@spammotel.com wrote:

> Eigentlich kommt mir die Frage schon fast zu einfach vor aber
> irgendwie bekomme ich immer nur die Schnittmenge bzw. das Kreuzprodukt
> raus. Bitte helft mir meinen Hirnknoten zu entwirren.

NOT EXISTS via PK

--
Oliver Lehmann
http://www.pofo.de/
http://wishlist.ans-netz.de/

Re: Alle Daten aus Tabelle1 die nicht in Tabelle2 vorkommen

am 31.07.2007 22:55:50 von hans.schneider8

On 31 Jul., 17:34, RBTMEKRDQ...@spammotel.com wrote:
> Hallo,
>
> ich habe zwei Tabellen mit exakt der selben Struktur. Auch der Inhalt
> ist sich sehr ähnlich. Nun möchte ich herausfinden wo sich die
> Tabellen unterscheiden. Hierzu brauche ich ein SQL-Statement das mir
> die Zeilen Anzeigt die zwar in Tabelle1 aber nicht in Tabelle2
> vorkommen.
>
> Eigentlich kommt mir die Frage schon fast zu einfach vor aber
> irgendwie bekomme ich immer nur die Schnittmenge bzw. das Kreuzprodukt
> raus. Bitte helft mir meinen Hirnknoten zu entwirren.
>
> Viele Grüße
> Ray

Hallo Ray,

da steht ein ähnliches Beispiel im MySQL-Buch von Michael Kofler im
Kapitel "SQL für Fortgeschrittene", z.B.

SELECT Tab1.PK FROM Tab1 LEFT JOIN Tab2 ON Tab1.PK =3D Tab2.PK WHERE
ISNULL(Tab2.PK)

oder so ähnlich, also mit LEFT JOIN verknüpfen um alle Datensätze der
Tabelle 1 anzuzeigen, und dann mit ISNULL die fehlenden entsprechenden
zu finden.

Mfg, Hans

Re: Alle Daten aus Tabelle1 die nicht in Tabelle2 vorkommen

am 01.08.2007 09:24:09 von RBTMEKRDQKDL

On 31 Jul., 22:55, hans.schneid...@freenet.de wrote:
> Hallo Ray,

Hallo Hans,

> SELECT Tab1.PK FROM Tab1 LEFT JOIN Tab2 ON Tab1.PK =3D Tab2.PK WHERE
> ISNULL(Tab2.PK)

> oder so ähnlich, also mit LEFT JOIN verknüpfen um alle Datensätze d=
er
> Tabelle 1 anzuzeigen, und dann mit ISNULL die fehlenden entsprechenden
> zu finden.

Die Idee ist nicht schlecht, aber ich habe leider keinen PK sondern
muss sozusagen sämmtliche Spalten einer Zeile zum Vergleich
heranziehen. Irgendwie bekomme ich das aber nicht hin.

Für weitere Vorschläge wäre ich dankbar.

Viele Grüße
Ray

Re: Alle Daten aus Tabelle1 die nicht in Tabelle2 vorkommen

am 01.08.2007 17:02:36 von B.Steinbrink

On Wed, 01 Aug 2007 00:24:09 -0700, RBTMEKRDQKDL wrote:
^^^^^^^^^^^^
Und das haben die Leute im Amt als Namen durchgehen lassen?

> On 31 Jul., 22:55, hans.schneid...@freenet.de wrote:
>> Hallo Ray,
>
> Hallo Hans,
>
>> SELECT Tab1.PK FROM Tab1 LEFT JOIN Tab2 ON Tab1.PK = Tab2.PK WHERE
>> ISNULL(Tab2.PK)
>
>> oder so ähnlich, also mit LEFT JOIN verknüpfen um alle Datensätze der
>> Tabelle 1 anzuzeigen, und dann mit ISNULL die fehlenden entsprechenden
>> zu finden.
>
> Die Idee ist nicht schlecht, aber ich habe leider keinen PK sondern muss
> sozusagen sämmtliche Spalten einer Zeile zum Vergleich heranziehen.
> Irgendwie bekomme ich das aber nicht hin.

Autsch.

> Für weitere Vorschläge wäre ich dankbar.

Hier mal in ganz extrem häßlich aber dafür auch relativ universal (glaube
ich ;-))
Braucht allerdings MySQL 5 (oder gabs das INFORMATION_SCHEMA schon in
4.1?)

@s == Datenbankname
@t1 == Name von Tabelle 1
@t2 == Name von Tabelle2

set @s = 'test', @t1 = 'foo', @t2 = 'foo2';

set @conditions = (
SELECT
GROUP_CONCAT(
IF(is_nullable='YES',
CONCAT('(',table_name,'.',column_name,'=',column_name,' OR ',
table_name,'.',column_name,' IS NULL AND ',
column_name,' IS NULL)'),
CONCAT(table_name,'.',column_name,'=',column_name)
)
SEPARATOR ' AND ')
FROM
INFORMATION_SCHEMA.columns
WHERE table_schema=@s and table_name=@t1
);

SET @query = CONCAT(
'SELECT * FROM ',@t1,' WHERE ',
'NOT EXISTS (SELECT * FROM ',@t2,' WHERE ', @conditions, ')'
);

PREPARE s FROM @query;

EXECUTE s;


Das @conditions Ungeheuer baut dir ne Reihe von Bedingungen auf, entweder
Spaltengleichheit oder, falls NULL möglich ist, auch IS NULL (wobei das
natürlich dann auch für beide Tabellen gelten muss). Spart die Arbeit,
dass ganze von Hand zusammen bauen zu müssen (wobei das bei wenigen
Spalten wohl schneller gewesen wäre ;-)). Das Monstrum wird dann in nen
einfaches NOT EXISTS Konstrukt eingesetzt und ausgeführt.

Ist wahrscheinlich nicht die schnellste Variante, aber für z.B. nen LEFT
JOIN müsste man zumindest mal eine Spalte kennen, die nicht NULL werden
kann...

Björn