![]() |
Datenbank: Firebird • Version: 2 • Zugriff über: SQL
Firebird: MINUS bzw. EXCEPT
Hi!
Stellen wir uns vor, es ist folgende Tabelle "Assistenten" gegeben: PersNR, Name, Boss 1111, Meier, 2345 2456, Schmidt, 2345 3456, Müller, 5555 3457, Maus, 5555 Wie muss eine Abfrage aussehen, die mir alle die Assistenten zurückgibt, bei deren Boss niemand beschäftigt ist, der eine größere PersNr hat? Also ich hätte als Ergebnis gerne 3456 und 3457, aber nicht 1111, weil bei 2345 jemand angestellt ist mit größerer Nummer (2456). Das Ganze soll an sich mit MINUS bzw. EXCEPT gehen, aber das kennt FireBird beides nicht. Meine Versuche es mit EXISTS nachzubilden gingen schief... Grüße, Frederic |
Re: Firebird: MINUS bzw. EXCEPT
Hallo,
ueig doch mal deine Exists-Versuche. Das ist auf jeden Fall schon mal ein Ansatz. BTW: Wer zum Teufel braucht so eine Abfrage ? ;) Ausserdem: 3456, Müller, 5555 3457, Maus, 5555 die 3456 darf er doch auch nicht zurückgeben, weil beim Boss 5555 ja die 3457, also grösser als die 3456 angestellt ist ??? Heiko |
Re: Firebird: MINUS bzw. EXCEPT
Hi!
Es ist ja nur ein Beispiel :mrgreen: - Grundlagen-Vorlesung lässt grüßen. Die Ausgabe der beiden Tupel ist schon gewollt, das mit dem größer soll sich nur auf den Vergleich PersNr zu Boss beziehen und 3456 und 3457 sind kleiner als 5555 - was mit denen untereinander ist, ist egal. Hier der fehlgeschlagene exists-Versuch:
SQL-Code:
Das liefert aber ein leeres Ergebnis.
select persnr from assistenten a where not exists (select persnr from assistenten s WHERE s.persnr >a.boss)
Grüße, Frederic |
Re: Firebird: MINUS bzw. EXCEPT
Hallo,
also ... Du willst alle die Ass.Nummern, wo keiner eine größere Nummer also der Boss hat ? Dann etwa so
SQL-Code:
select a1.* from ass a1
where not exists (select a2.assnr from ass a2 where (a2.assnr>=a2.bossnr) and (a2.bossnr=a1.bossnr)) Aber eine Warnung: Subselects unter FB gelten nicht gerade als superschnell, das select a2... wird ja für jeden Datensatz ausgeführt. Auf AssNr und BossNr sollten auf jeden Fall Indizes sein. Heiko |
Re: Firebird: MINUS bzw. EXCEPT
Genau, ich will alle die Assistenten bei denen kein Kollege (also niemand beim gleichen Boss) eine Personalnr hat, die größer ist als die des (gemeinsamen) Bosses.
PersNR, Name, Boss 1111, Meier, 2345 2456, Schmidt, 2345 3456, Müller, 5555 3457, Maus, 5555 Deswegen wären es bei dieser Ausprägung die Nummern 3456 und 3457, weil bei 5555 eben nur Leute mit kleinerer Nummer arbeiten (und das sind eben 3456 und 3457). 1111 und 2456 sind nicht dabei, da bei 2345 jemand arbeitet, der eine größere Nummer (2456) hat. Es soll aber quasi nur ein Beispiel sein. Die Kernfrage ist, wie man MINUS in FB nachbauen kann. Dazu fand ich per Google eben diesen Weg mit NOT EXISTS, der aber scheinbar so nicht das tut, was er soll.... Grüße, Frederic |
Re: Firebird: MINUS bzw. EXCEPT
|
Re: Firebird: MINUS bzw. EXCEPT
Genau auf dieser Seite war ich ja - daher stammt ja die Idee MINUS durch EXISTS auszudrücken - aber es funktioniert leider nicht - zumindest nicht so. Da kommt statt 3456+3457 ne leere Antwort raus.
Grüße, Frederic |
Re: Firebird: MINUS bzw. EXCEPT
Hallo,
auch hiermit ?
SQL-Code:
Da kommen bei mir brav die letzten beiden Nummern.
select a1.* from ass a1
where not exists (select a2.assnr from ass a2 where (a2.assnr>=a2.bossnr) and (a2.bossnr=a1.bossnr)) Heiko |
Re: Firebird: MINUS bzw. EXCEPT
Sehr schön - bei mir auch - werde mal nachher versuchen zu verstehen, warum das geht und das andere nicht...
Danke! Grüße, Frederic |
Re: Firebird: MINUS bzw. EXCEPT
Hallo,
also bei mir liefert
SQL-Code:
auch die beiden letzten Nummern zurück (getestet unter FB1.5 und FB2.1).
select persnr from assistenten a where not exists (select persnr from assistenten s WHERE s.persnr >a.boss)
Ich würde aber sicherheitshalber
SQL-Code:
schreiben
select a.persnr from assistenten a where not exists (select s.persnr from assistenten s WHERE s.persnr >a.boss)
Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz