Query Frage: 2 Tabellen - Differenz finden (Datensätze die nicht da sind)

MySQL, PostgreSQL, SQLite
alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Query Frage: 2 Tabellen - Differenz finden (Datensätze die nicht da sind)

Post by alexander newald » 2005-12-27 20:36

Hi,

ich habe eine Tabelle db1 mit (userid varchar(16), id bigint(50)) und eine db2 mit (id bigint(50), news varchar(250)).

Nun möchte ich alle Einträge aus db2 die für eine bestimmte userid noch nicht in db1 stehen.

Wie macht man das *nur* in mySQL?

[gca].dfritz
Posts: 28
Joined: 2004-11-30 08:34
Location: Alpen

Re: Query Frage: 2 Tabellen - Differenz finden (Datensätze die nicht da sind)

Post by [gca].dfritz » 2005-12-28 16:47

Alexander Newald wrote: ich habe eine Tabelle db1 mit (userid varchar(16), id bigint(50)) und eine db2 mit (id bigint(50), news varchar(250)).

Nun möchte ich alle Einträge aus db2 die für eine bestimmte userid noch nicht in db1 stehen.
Hi,

wenn ich das richtig sehe, hast Du doch garkeine Userid in deiner DB2. Falls doch, denke ich das es mit einer simpelen SQL Abfrage nicht getan ist. Da muss dann schon mit Schleifen gearbeitet werden.

Gruß Dfritz

bfrackie
Posts: 63
Joined: 2003-08-26 12:00

Re: Query Frage: 2 Tabellen - Differenz finden (Datensätze die nicht da sind)

Post by bfrackie » 2005-12-31 03:22

also verstehen tue ich die frage noch nicht, aber vielleicht hilft dir das ja (vorausgesetzt id ist in beiden tabellen der foreign key):


SELECT * FROM db2 WHERE id NOT IN (SELECT id FROM db1 GROUP BY id)

damit erhälst du alle eintrage von db2, die keinen passenden schlüssel in db1 haben.

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Query Frage: 2 Tabellen - Differenz finden (Datensätze die nicht da sind)

Post by alexander newald » 2005-12-31 09:33

ja, sowas habe ich gesucht

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: Query Frage: 2 Tabellen - Differenz finden (Datensätze die nicht da sind)

Post by isotopp » 2006-01-26 19:23

Alexander Newald wrote:ich habe eine Tabelle db1 mit (userid varchar(16), id bigint(50)) und eine db2 mit (id bigint(50), news varchar(250)).

Nun möchte ich alle Einträge aus db2 die für eine bestimmte userid noch nicht in db1 stehen.

Wie macht man das *nur* in mySQL?
Mit einem LEFT JOIN:

Code: Select all

select db1.userid from db1 left join db2 on db1.userid = db2.id where isnull(db2.id)
Und das performt wie Scheiße, denn das ist ein JOIN von einem varchar(16) gegen ein bigint, damit ist für jede Zeile ein Typecast fällig und damit kann ein eventuell vorhandener Index nicht verwendet werden.

Außerdem sollte natürlich ein Index auf db1.userid und db2.id vorhanden sein, damit das schnell ist.

Hintergrund: Ein LEFT JOIN listet alle Werte aus der Tabelle 1 auf und sucht für jeden Wert aus der ON-Condition von Tabelle 1 den angegebenen passenden Wert aus Tabelle 2. Wenn kein passender Wert vorhanden ist, werden NULL-Werte generiert.

Die WHERE-Clause unterdrückt alle Werte aus Tabelle 1, für die KEIN Nullwert vorhanden ist, listet also nur die db1.userid auf, für die keine db2.id vorhanden ist.