Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird: MINUS bzw. EXCEPT (https://www.delphipraxis.net/137454-firebird-minus-bzw-except.html)

fkerber 21. Jul 2009 07:42

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

hoika 21. Jul 2009 08:04

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

fkerber 21. Jul 2009 08:19

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:
select persnr from assistenten a where not exists (select persnr from assistenten s WHERE s.persnr >a.boss)
Das liefert aber ein leeres Ergebnis.

Grüße, Frederic

hoika 21. Jul 2009 08:28

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

fkerber 21. Jul 2009 08:32

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

hoika 21. Jul 2009 08:38

Re: Firebird: MINUS bzw. EXCEPT
 
Hallo,

MINUS kannte ich gar nicht ;)

Firebird Minus


Heiko

fkerber 21. Jul 2009 08:42

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

hoika 21. Jul 2009 09:10

Re: Firebird: MINUS bzw. EXCEPT
 
Hallo,

auch hiermit ?

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))
Da kommen bei mir brav die letzten beiden Nummern.


Heiko

fkerber 21. Jul 2009 09:17

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

hoika 21. Jul 2009 09:42

Re: Firebird: MINUS bzw. EXCEPT
 
Hallo,

also bei mir liefert

SQL-Code:
select persnr from assistenten a where not exists (select persnr from assistenten s WHERE s.persnr >a.boss)
auch die beiden letzten Nummern zurück (getestet unter FB1.5 und FB2.1).

Ich würde aber sicherheitshalber

SQL-Code:
select a.persnr from assistenten a where not exists (select s.persnr from assistenten s WHERE s.persnr >a.boss)
schreiben


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz