Ausgabe von nicht vorhandenen Werten

Hallo,

ich habe ein Frage wie wann am besten nicht vorhandene Werte ausgeben kann.

Folgende Tabelle: a

stadt |nummer

Leipzig | 4342
Bochum | 2334
Leipzig | 3455
Bochum | 5555
Leipzig | 4444

Nun möchte ich prüfen, ob bestimmte nummern in Leipzig vorhanden sind oder nicht.

Mit dieser Anweisung bekommt man schnell die Liste der vorhandenen nummern

select *
from a
where stadt=‘Leipzig’ and
(nummer = ‘4342’ or
nummer = ‘3455’ or
nummer = ‘5555’)

Die Ausgabe ist:

Leipzig | 4342
Leipzig | 3455

Was mich aber wirklich interessiert, ist das die Nummer 5555 nicht vorhanden ist. Welche Abfrage muss man anstellen damit man zu dieser Ausgabe kommt, also die nummer ausgeben die nicht vorhanden ist:

5555


Grüße,

Thomas

Das sieht nach einem Problem für Normalisierung aus.
Wenn du die Städte und die zugehörigen Nummern trennst und in eine 1:n Tabelle auslagerst, kannst du mittels COUNT() abfragen, ob eine Nummer für eine Stadt existiert oder nicht.

Wenn ich dein Problem jetzt verstanden habe …

Was nicht vorhanden ist, kann nicht ausgegeben werden…

Folgende Tabelle: a

stadt |nummer

Leipzig | 4342
Bochum | 2334
Leipzig | 3455
Bochum | 5555
Leipzig | 4444

Nun möchte ich prüfen, ob bestimmte nummern in Leipzig vorhanden sind oder nicht.


Was mich aber wirklich interessiert, ist das die Nummer 5555 nicht vorhanden ist. Welche Abfrage muss man anstellen damit man zu dieser Ausgabe kommt, also die nummer ausgeben die nicht vorhanden ist:

5555


Grüße,

Thomas


test=*# select * from a;
  stadt  | nummer
---------+--------
 leipzig |   4342
 bochum  |   2334
 leipzig |   3455
 bochum  |   5555
 leipzig |   4444
(5 rows)

Time: 0.947 ms
test=*# select nummer from a where nummer in(4342,3455,5555) and stadt != 'leipzig';
 nummer
--------
   5555
(1 row)

Ansonsten: siehe Antwort von ads.

Andreas

Hallo Andreas, das ist ja gerade mein Problem. Ich möchte daten ausgeben die nicht vorhanden sind. Die angegebene Tabelle ist nur ein Beispiel, würde z.B. der Eintrag Bochum mit 5555 nicht vorhanden sein, denke ich das die von dir genannte Abfrage auch nicht die 5555 liefert.

Nun, ich weiss ja immer noch nicht genau, wo du hinmöchtest - aber sagt dir Normalisierung von Daten etwas?
Vielleicht bekommst du eine Idee für dein Problem, wenn du deine Tabellenstruktur dahingehend überarbeitest.

Hallo ads,

tut mit leid Normalisierung von Daten sagt mir zur Zeit nichts, werde ich mir aber noch anschauen. Eventuell drücke ich mich etwas unverständlich aus, oder das meine Abfrage ist mit SQL nicht zu realisieren und die Auswertung muss hinterher in einem perl script erfolgen.

Im oben genannten Bespiel habe ich drei Nummern 4342,3455,5555 und möchte nun prüfen ob diese Nummern in der Stadt Leipzig existieren. Die Datenbank die ich abfragen muss ist eine nicht von mir verwaltete, ich kann dort nur ‘select’ absetzen. Ein Änderung in der DB ist definitiv nicht möglich.

Ok die vorhandenen Rufnummern, bekomme ich ja schnell raus. Leider brauche ich diese Information nicht, sondern die Information welche Einträge nicht in der Tabelle meinen Suchkriterien entsprachen, sprich 5555. Eventuell verlange ich ja zuviel, oder ich sollte einfach die Ausgabe von den vorhandenen Rufnummern mit einem perl script auswerten und dann die nicht gefundenen Werte aus meiner Inputliste ausgeben.


Grüße,

Thomas

Dann nehme:

test=*# (select 'leipzig',4342 union select 'leipzig',3455 union select 'leipzig',5555) except select * from a where stadt='leipzig' and nummer in (4342,3455,5555);
 ?column? | ?column?
----------+----------
 leipzig  |     5555
(1 row)

Schön ist vermutlich was anderes.

Andreas

Sagt Dir Google wenigstens was? Wenn Du dort als Suchbegriif “Normalisierung von Daten” reinkippst, ist gleich der erste Eintrag ein zielführender, Wikipedia.

An das war einfach dreas