SQL Select nach nicht vorhandenen Einträgen

gfeschu

Ensign
Registriert
Aug. 2010
Beiträge
147
Hallo zusammen

Die Überschrift ist vllt etwas verwirrend, sorry. :)
Es geht darum, das ich eine Liste von Benutzern habe (z.B. 200 Stück).
Diese lasse ich durch eine Schlaufe (Standardprozess von dem System) Abfragen ob es diese Benutzer bereits gibt.

Ich möchte aber als return haben, welche Benutzer es 'nicht!' gibt. Die Funktion nvl habe ich schon ausprobiert. Bei einem Eintrag, eine NULL zu ersetzten funktioniert. Aber etwas zurückgeben, was gar nicht exisitert (der Eintrag an sich) geht glaube ich nicht oder? Sieht jedenfalls so aus...

Habt ihr einen Tipp, oder hab ich einen Logikfehler? :)

Gruss gfeschu
 
Ich würde sagen da kannst Du auf das Ergebnis der Nutzerabfrage einen Outer Join mit der ursprünglichen Liste machen und dann gezielt die Nutzer mit NULL-Einträgen (oder eben vorhandenen Gegenstücken) rauspicken.
Mir ist nicht ganz klar was du genau vorhast, aber eventuell wäre es optimaler bei der Nutzerabfrage gleich die Nutzer, die nicht (mehr) vorhanden sind, in eine entsprechende Tabelle zu schreiben?
 
Zuletzt bearbeitet:
Je nachdem, was genau Du vorhast und wieviele Benutzer in der DB existieren würd ich es mit zwei arrays lösen und dann prüfen, ob die Benutzernamen aus der Liste in dem anderen array existieren und diese aus dem array löschen. Am Ende hast Du dann ein array mit Benutzernamen, die nicht in der DB vorhanden sind.

Das geht natürlich in einer anderen Sprache als SQL ;-)
 
In dem System das ich arbeite, bin ich leider nicht wirklich flexibel, da vieles vom Standard gegeben ist.

Die Werte von der Abfrage werden an einen Report weitergegeben. Mit diesem kann ich anschliessend die Resultate der Abfrage grafisch anzeigen (Standard vom Tool).
Wenn ich jetzt aber nichts zurückbekomme, kann ich nichts anzeigen. Ein einfaches '0' würde zum Beispiel reichen.

Klingt etwas verwirrend, ist leider auch so. :freak:
 
Select * from AllUsers where NOT EXISTS (select * from ExisitingUsers where a.name=b.name)

Sollte alle User aus A Ausgeben welche in b nicht enthalten sind.

Wenn ich deine Fragestellung verstanden hab könnte das klappen.
 
Das geht natürlich in einer anderen Sprache als SQL ;-)

Ach! Und in SQL nicht?

@Topic:
set serveroutput on size unlimited

declare

CURSOR User_line IS SELECT * FROM Userlist1;

begin

FOR User_rec IN User_line LOOP

SELECT USER_ID FROM Userlist2 AS UL2 WHERE USER_ID = User_rec.USER.ID;
IF UL2.USER_ID IS NULL THEN

DBMS_OUTPUT.PUT_LINE( User_rec.USER.ID);

END IF;

END LOOP;

end;
 
Shimmy979 schrieb:
Select * from AllUsers where NOT EXISTS (select * from ExisitingUsers where a.name=b.name)

NOT EXISTS Kennt aber nicht jede Datenbank - alternativ einfach einen Left Join in Verbindung mit IS NULL

Select * from AllUsers a
LEFT JOIN ExisitingUsers e ON a.whatever = e.whatever
WHERE e.id IS NULL

Je nach DB kann das auch schneller sein da keine Subselects ausgelöst werden.

Allerdings bin ich mir dank der schlechten Problembeschreibung gar nicht sicher ob das überhaupt die gesuchte Lösung ist.
 
Zieh einfach die Mengen ab.
"Datenbank Einträge aller Mitarbeiter" - "Vorhandene User nach der Schleife" = "Nicht vorhandene User"

SELECT * FROM Benutzer
MINUS
<Ergebnis deiner Schlaufe>

ODER:

SELECT * FROM Benutzer WHERE Benutzer NOT IN (Ergebnis deiner Schlaufe)
 
Zuletzt bearbeitet:
Zurück
Oben