SQL Abfrage ob Datensatz vorhanden ist

alebec7

Ensign
Registriert
Juni 2008
Beiträge
154
Ich habe folgendes Problem:

Ich habe zwei Tabellen: Faecher und KlassenFaecher. In der Faecher- Tabelle gibt es die Spalten fa_ID, Name, Abk. KlassenFaecher hat fa_id, aus_id.

In einem Programm was ich in C# geschreiben habe, kann man diese Tabellen verändern (neuen Datensatz anlegen, ändern löschen etc.).

Nun brauche ich aber einen SQL- Befehl, der mir die fa_id anzeigt, die es in Faecher gibt aber nicht in KlassenFaecher. Habe schon alles probiert aber komme nicht zum Ergebnis.
 
Zuletzt bearbeitet:
Vielleicht so:

Code:
SELECT fa_ID
FROM Faecher
WHERE fa_ID NOT IN (
  SELECT fa_ID
  FROM KlassenFaecher
);
 
Zuletzt bearbeitet von einem Moderator: (Fullquote entfernt.)
Genau, so könnte man es wohl schreiben.

Eine Alternative wäre ein Join. Könnte dann so aussehen:
Code:
SELECT fa_id FROM Faecher
LEFT JOIN KlassenFaecher USING fa_id
WHERE fa_id IS NULL

Kommt an der Stelle ein bisschen auf das DBMS an, das du benutzt. In den meisten Fällen ist ein Join jedoch schneller als ein Subselect.

df
 
darefilz schrieb:
Kommt an der Stelle ein bisschen auf das DBMS an, das du benutzt. In den meisten Fällen ist ein Join jedoch schneller als ein Subselect.

df

Als DB- Server benutze ich PostgreSQL. Und da in der faecher Tabelle nur ca. 140 Fächer sind reicht mir das.
 
Du kannst auch folgendes machen:

SELECT fa.fa_id
FROM faecher fa
WHERE NOT EXISTS (SELECT 1 FROM klassenfaecher kfa WHERE kfa.fa_id = fa.fa_id)



Zur Info:
NOT EXISTS und NOT IN erzwingen unterschiedliche herangehensweisen.

Die EXISTS Version verwendet man wenn die Menge innerhalb des Subselects im Verhältnis zum übergeordneten Select relativ groß ist. Bei EXISTS wird Oracle zuerst das äußere SQL ausführen und es danach mit der Menge der Subquery vergleichen.

Bei IN ist es genau umgekehrt. Hier wird zuerst das Innere SQL ausgeführt und dann mit dem äusseren verglichen.

Um deine SQLs analysieren zu können ist es weiterhin wichtig zu wissen ob die Tabellen analysiert wurden (wenn du den kostenbasierten Optimizer verwendest), welche Indices auf den Tabellen liegen und wie der Ausführungsplan aussieht.

Eine pauschale Aussage welches schneller ist gibt es nicht, denn es ist immer abhängig vom Mengengerüst, bei kleinen Mengen ist da nicht viel Unterschied zu sprüren...
 
Zurück
Oben