SQL Query fehlende Referenz

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

SQL Query fehlende Referenz

Beitragvon fliegermichl » 27. Sep 2019, 07:49 SQL Query fehlende Referenz

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?
fliegermichl
Lazarusforum e. V.
 
Beiträge: 491
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon af0815 » 27. Sep 2019, 09:07 Re: SQL Query fehlende Referenz

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).
af0815
 
Beiträge: 3939
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon fliegermichl » 27. Sep 2019, 10:34 Re: SQL Query fehlende Referenz

Genau um das where Statement geht es mir ja.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 491
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon af0815 » 27. Sep 2019, 15:11 Re: SQL Query fehlende Referenz

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).
af0815
 
Beiträge: 3939
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon martin_frb » 28. Sep 2019, 11:49 Re: SQL Query fehlende Referenz

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"
martin_frb
 
Beiträge: 457
Registriert: 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other | 
CPU-Target: mostly 32 bit
Nach oben

Beitragvon fliegermichl » 30. Sep 2019, 01:29 Re: SQL Query fehlende Referenz

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 :?:
fliegermichl
Lazarusforum e. V.
 
Beiträge: 491
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Eb » 1. Okt 2019, 16:54 Re: SQL Query fehlende Referenz

Könntest du vielleicht dein Export-Statement und die Tabellendefinitionen beider Tabellen (create table statements) posten?
Eb
Lazarusforum e. V.
 
Beiträge: 202
Registriert: 5. Feb 2008, 15:32
Wohnort: Stuttgart
OS, Lazarus, FPC: linux - Laz 1.4.2 | 
CPU-Target: 32Bit
Nach oben

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron
porpoises-institution
accuracy-worried