SQL Query fehlende Referenz
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
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?
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?
- af0815
- Lazarusforum e. V.
- Beiträge: 6768
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: SQL Query fehlende Referenz
Nimm JOIN - je nachdem wo welche Tabelle steht ein RIGHT JOIN oder LEFT JOIN
In etwa so
Wenn st dir nur die Anzeigen willst, welche keine Zurordnung haben, dann hänge das entsprechende WEHRE Statement an.
In etwa so
Code: Alles auswählen
SELECT catalog.kontaktID, .....
FROM catalog
LEFT JOIN kontakt ON catalog.kontaktID = kontakt.kontaktID
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: SQL Query fehlende Referenz
Genau um das where Statement geht es mir ja.
- af0815
- Lazarusforum e. V.
- Beiträge: 6768
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
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).
-
- Beiträge: 586
- 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
Such dir was aus...
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.
Bei dem "inner join" lassen sich die extra Zeilen NICHT hinzufügen. Bei allen anderen geht "or kontactId is null"
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;
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;
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: SQL Query fehlende Referenz
Hmm ich hab mal die Version probiert:
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
Code: Alles auswählen
SELECT * FROM catalog WHERE NOT EXISTS( SELECT 1 FROM kontakt WHERE id = catalog.KontaktID ) OR kontaktId IS NULL
grübel

-
- Lazarusforum e. V.
- Beiträge: 240
- Registriert: Di 5. Feb 2008, 15:32
- OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
Re: SQL Query fehlende Referenz
Könntest du vielleicht dein Export-Statement und die Tabellendefinitionen beider Tabellen (create table statements) posten?