SQL Query fehlende Referenz

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 620
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

SQL Query fehlende Referenz

Beitrag von fliegermichl »

Hallo,

hat zwar mal so gar nix mit Lazarus zu tun aber vielleicht weiss ja doch jemand eine Antwort auf meine Frage.
Ich habe 2 Tabellen kontakt und catalog.

catalog hat eine Spalte kontaktid um einen oder mehrere Kataloge einem Kontakt zuordnen zu können.

Bei einem Export ist mir aufgefallen, daß ich 60 Katalog Einträge exportiere aber die Tabelle 62 Zeilen hat.

Wie kann ich jetzt die Zeilen ermitteln wo der entsprechende Kontakt fehlt also kontaktid auf einen Datensatz in kontakt verweist, den es nicht gibt?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4222
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: SQL Query fehlende Referenz

Beitrag von af0815 »

Nimm JOIN - je nachdem wo welche Tabelle steht ein RIGHT JOIN oder LEFT JOIN

In etwa so

Code: Alles auswählen

 
SELECT catalog.kontaktID, .....
  FROM catalog
    LEFT JOIN kontakt ON catalog.kontaktID = kontakt.kontaktID
 


Wenn st dir nur die Anzeigen willst, welche keine Zurordnung haben, dann hänge das entsprechende WEHRE Statement an.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 620
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: SQL Query fehlende Referenz

Beitrag von fliegermichl »

Genau um das where Statement geht es mir ja.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4222
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: SQL Query fehlende Referenz

Beitrag von af0815 »

Schau dir mal die Ergebnisliste an, da sieht man normalerweise wie man mit WHERE filtert. Bei denjenigen was nicht zusammenpassen sind dann Einträge NULL oder leer, je nach DB System. Da hängen die Ergebnisse ein wenig vom DB-System ab.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

martin_frb
Beiträge: 485
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: SQL Query fehlende Referenz

Beitrag von martin_frb »

Such dir was aus...

Code: Alles auswählen

 
SELECT * FROM catalog WHERE NOT EXISTS( SELECT 1 FROM kontact WHERE id = catalog.kontactId );
 
SELECT * FROM catalog WHERE ( SELECT count(*) FROM kontact WHERE id = catalog.kontactId )  > 0;
 
SELECT * FROM catalog INNER JOIN kontact ON  kontact.id = catalog.kontactId );
 
SELECT * FROM catalog LEFT JOIN kontact ON  kontact.id = catalog.kontactId )  WHERE kontact.id IS NOT NULL;
 
 

Ich gehe davon aus das kontact.id unique ist (primary key)?
Ansonsten werden ggf beim "join" Zeilen aus catalog doppelt angezeigt. (Ein group by kann das vermeiden, aber dann doch lieber den sub-querry)

------------
Wenn catalog.KontactId null-able ist, werden auch Zeilen gefiltert bei denen catalog.KontactId null ist.

Die bedingung: " kontaktid auf einen Datensatz in kontakt verweist, den es nicht gibt" erlaubt aber solche null Einträge.

Code: Alles auswählen

 
SELECT * FROM catalog WHERE NOT EXISTS( SELECT 1 FROM kontact WHERE id = catalog.kontactId )  OR   kontactId IS NULL;
 

Bei dem "inner join" lassen sich die extra Zeilen NICHT hinzufügen. Bei allen anderen geht "or kontactId is null"

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 620
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: SQL Query fehlende Referenz

Beitrag von fliegermichl »

Hmm ich hab mal die Version probiert:

Code: Alles auswählen

 
SELECT * FROM catalog WHERE NOT EXISTS( SELECT 1 FROM kontakt WHERE id = catalog.KontaktID ) OR kontaktId IS NULL
 


Das lieferte 3 Datensätze. Alle 3 lieferten eine kontaktId die es in der Tabelle kontakt tatsächlich nicht gibt. Ich hätte jetzt aber 2 vermutet.

grübel :?:

Eb
Lazarusforum e. V.
Beiträge: 209
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.0.6
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: SQL Query fehlende Referenz

Beitrag von Eb »

Könntest du vielleicht dein Export-Statement und die Tabellendefinitionen beider Tabellen (create table statements) posten?

Antworten