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. :)