Entwickler-Ecke
Datenbanken - SQL Abfrage
dm - Di 04.02.03 11:52
Titel: SQL Abfrage
Hallo,
ich möchte folgendes realisieren: Man kann nach einem Kriterium (z.B. Nachname in der Datenbank Personal) suchen. Jedoch nicht nur nach einem zur Zeit sondern man kann mehrere Nachnamen gleichzeitig suchen lassen.
Nun die Frage: Wie kann ich abfragen, ob ein Datensatz den ich gesucht habe vorhanden ist oder nicht ?
Ich habe eine Sucheingabemaske gebastelt, bei der der Anwender mehrere Nachnamen eingeben kann und die Daten werden dann, falls vorhanden, am BIldschirm ausgegeben.
Nun möchte ich aber bei den Nachnamen die nicht gefunden (weil nciht vorhanden) wurden eine Fehlermeldung danebenschreiben, damit der Anwender sofort sieht, WELCHE Datensätze nicht vorhanden sind.
Lange Rede kurzer Sinn: wie kann ich mit SQL überprüfen, ob ein Datensatz vorhanden ist ohne die Ausgabe (z.B. DBGrid) manuell zu durchsuchen?
Gruß Dennis
Udontknow - Di 04.02.03 12:58
Hi!
Nun, du nimmst einfach eine Query und lässt für jeden Namen das Statement
select count(*) from Tabelle where Nachname="MeinName"
eintragen. Nach dem Öffnen der Query kannst du einfach die Anzahl der für diesen Nachnamen gefundenen Datensätze prüfen (Query.RecordCount).
Cu,
Udontknow
neojones - Di 04.02.03 13:13
Man könnte temporör eine Tabelle anlegen, die alle Suchbegriffe enthält (z.B: tmp_namen). Dann mit einem LEFT JOIN suchen:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| SELECT tmp_namen.name, dat_suchtabelle.name, COUNT(dat_suchtabelle.name) AS anzahl
FROm tmp_namen
LEFT JOIN dat_suchtabelle ON tmp_namen.name = dat_suchtabelle.name
GROUP BY dat_suchtabelle.name |
Um alle Datensätze zurückzuliefern, für die kein Ergebnis gefunden wurde:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| SELECT tmp_namen.name, dat_suchtabelle.name, COUNT(dat_suchtabelle.name) AS anzahl
FROm tmp_namen
LEFT JOIN dat_suchtabelle ON tmp_namen.name = dat_suchtabelle.name
WHERE dat_suchtabelle.name IS NULL
GROUP BY dat_suchtabelle.name |
dm - Di 04.02.03 13:35
erstmal danke euch beiden,
werde das gleich nach der mittagspause :) mal ausprobieren
dm - Di 04.02.03 13:54
udontknow :
dann weiss ich aber immernoch nicht, WELCHE datensätze nicht geunden wurden, ich kenne nur die anzahl der gesuchten nud die anzahl der gefundenden datensätze.
Udontknow - Di 04.02.03 16:26
Hmm? Wieso? Was ist mit folgender Schlussfolgerung :
"Wenn die Anzahl der ermittelten Datensätze für den aktuellen Namen null ist, gibt es keinen Datensatz für diesen Namen." :wink:
Also, nehmen wir mal an, du hast die zu suchenden Namen in einer Listbox:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for i:=0 to ListBox.Items.Count-1 do begin Query.SQL.Text:='Select * from tabelle where Nachname="'+ListBox.Items[i]+'"'; Query.Active:=True; if CDS.RecordCount=0 then ListBox.Items[i]:=ListBox.Items[i]+' NICHT GEFUNDEN'; Query.Active:=False; end; |
Cu,
Udontknow
Udontknow - Di 04.02.03 16:34
@Neojones: Dein Beispiel ist für Multi-User-Datenbanken nicht gerade zu empfehlen... Hmmm... Naja, sofern für jeden Benutzer ein eindeutiger Tabellenname genommen wird, gehts, aber elegant würde ich so etwas nicht nennen, Tabellen On-the-fly aufzubauen.
neojones - Di 04.02.03 17:48
Wir machen das so bei einer Datenbank, auf der 4000 (!!!) User arbeiten und übergeben in einem zusätzlichen Feld immer die Session-ID. Ein Trigger am Server löscht alle nicht mehr vorhandenen Session später raus.
Udontknow - Di 04.02.03 19:50
Also doch nicht temporär eine Tabelle anlegen und anschliessend wieder löschen, sondern einfach in einer Tabelle mit einem weiteren Feld für die Identifikation des Benutzers bzw. der Session Datensätze anlegen und löschen. So macht das Sinn, ja. :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!