Delphi-PRAXiS
Seite 2 von 2     12   

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)

TBx 21. Jul 2009 09:50

Re: Firebird: MINUS bzw. EXCEPT
 
Hier mal die beiden Versionen im Vergleich:

SQL-Code:
select persnr from assistenten a where not exists (select persnr from assistenten s WHERE s.persnr >a.boss)
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))
Warum die erste Version bei Dir kein Ergebnis geliefert hat, ist mir ein Rätsel.

Richtig ist allerdings das zweite Statement. In dem ersten Statement überprüfst Du nur, ob es irgendeine Persnr ist, die größer der aktuellen bossnr gibt, in der zweiten wird wie gewollt überprüft, ob es eine persnr gibt, die dem aktuellen boss zugeordnet ist und diese dann größer der aktuellen bossnr ist.

Hoffe das hilft Dir weiter.

Gruß
Thomas

fkerber 21. Jul 2009 10:09

Re: Firebird: MINUS bzw. EXCEPT
 
Hi!

Danke für die Erläuterungen - also von den geposteten Anfragen funktioniert in der Tat nur die hier:

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))
Alle anderen liefern leere Resultate.

Es handelt sich um Firebird 2.1.2.18118

Grüße, Frederic

Blup 21. Jul 2009 12:52

Re: Firebird: MINUS bzw. EXCEPT
 
Das SQL Nr.1 nicht funktioniert ist nur logisch.
Die Unterabfrage lautet:
Existiert irgendeine "persnr" die größer ist als die "persnr" des in der Hauptabfrage gerade bearbeiteten Bosses.
Wenn der Boss nicht gerade die höchste Nummer in der gesamten Tabelle hat, ist diese Bedingung immer erfüllt.
Dann wird das Ergebnis negiert und darum der Datensatz der Hauptabfrage verworfen.

Im SQL Nr.2 wird die Unterabfrage auf die Personen eingeschränkt, denen tatsächlich diesem Boss zugeordnet ist.

fkerber 21. Jul 2009 13:23

Re: Firebird: MINUS bzw. EXCEPT
 
Hi!

Danke für deine Erläuterung - das erscheint mir jetzt auch durchaus logisch - aber wieso geht es dann bei Heiko?


Grüße, Frederic

TBx 21. Jul 2009 13:39

Re: Firebird: MINUS bzw. EXCEPT
 
Hallo Frederic,

enthält Deine Tabelle tatsächlich nur diese Daten:
Zitat:

PersNR, Name, Boss
1111, Meier, 2345
2456, Schmidt, 2345
3456, Müller, 5555
3457, Maus, 5555

SQL-Code:
select persnr from assistenten a where not exists (select persnr from assistenten s WHERE s.persnr >a.boss)
findet nun für die beiden letzten Datensätze keinen Datensatz, bei dem die Persnr > der bossnr (5555) ist. Also gibt es ein Ergebnis.
Dieses entspräche in dieser Abfrage zufällig dem richtigen Ergebnis.

Fügst Du jetzt aber folgenden Datensatz an, gibt es eine leere Erbebnismenge:
Zitat:

5556, Kerber, 5555
Fügst Du
Zitat:

1112, Wolf, 2346
ein, liefert Dein Statement ein falsches Ergebnis. Der Datensatz soll nach Deinen Erläuterungen ausgegeben werden, wird es aber nicht, da es eine PersNr gibt, die > 2346 ist (aber dieser ist kein Boss < 2346 zugeordnet).

Hilft Dir das weiter?

fkerber 21. Jul 2009 14:37

Re: Firebird: MINUS bzw. EXCEPT
 
Hi!

Ah, dann war es quasi Zufall...
Das hier gepostete war nur ein Teil der Ausprägung, die in der Testtabelle drin sind.
Vielen Dank für die ausführliche Erläuterung.

Grüße, Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 Uhr.
Seite 2 von 2     12   

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