![]() |
Re: [SQL, firebird] "not in" Operator funktioniert
SQL-Code:
select
v.* from Buchung b join Vorgang v on v.VgNr != b.VgNr and v.VgNr != b.GsNr; |
Re: [SQL, firebird] "not in" Operator funktioniert
Zitat:
SQL-Code:
VGNR BRUTTO
1 20 2 13 5 11 Es sollte nur die VGNR 5 zurückgegben werden, wie im Ausgangspost beschrieben. |
Re: [SQL, firebird] "not in" Operator funktioniert
versuch mal folgendes:
SQL-Code:
Hope it Helps
select v.*
from vorgang v where v.brutto != 0 and not exists ( select b.bnnr from buchung b where b.vgnr = v.vgnr or b.gsnr = v.vgnr) onlinekater BTW: für diese Abfrage unbeding Indices setzen! [Edit]Bemerkung an mkienzler gelöscht, da nicht korrekt. [/Edit] |
Re: [SQL, firebird] "not in" Operator funktioniert
Was beweckst Du mit solch einem Konstrukt :
SQL-Code:
Insbesondere mit dem 2mal NOT ? :shock:
on v.VgNr not v.VgNr and v.VgNr not b.GsNr;
|
Re: [SQL, firebird] "not in" Operator funktioniert
Es scheint wirklich ein Problem mit dem not in zu geben:
SQL-Code:
funktioniert, die Umkehrung
select
v.* from Vorgang v where VgNr in (select VgNr from Buchung union select GsNr from Buchung) ;
SQL-Code:
nicht.
select
v.* from Vorgang v where VgNr not in (select VgNr from Buchung union select GsNr from Buchung) ; |
Re: [SQL, firebird] "not in" Operator funktioniert
Zitat:
Das Problem, warum Deine not in Abfrage nicht funktioniert, liegt darin, dass das select innerhalb der runden Klammern null enthält. Und jeder Vergleich eines Feldes gegen null aufGleichheit ergibt true :-) Und hier noch das Konstrukt aus dem Ursprungspost korrigiert, sodass das gewünschte Ergebnis erscheint:
SQL-Code:
Man sollte also bei solchen not-in-Konstrukten besser auf not-Exists-Konstrukte ausweichen, da man sich die Abfrage auf null sparen kann.
select * from Vorgang
where Brutto <> 0 and VgNr not in (select VgNr from Buchung where VgNr is not null) and VgNr not in (select GsNr from Buchung where gsnr is not null) Gruß onlinekater |
Re: [SQL, firebird] "not in" Operator funktioniert
Danke an alle! Beide Lösungen von onlinekater funktionieren. Wie sollte man denn für die Lösung aus #13 die Indices in beiden Tabellen anlegen, damit es performant läuft? Die Lösung #13 (not exists) ist ja die bessere von beiden, wenn ich es richtig verstanden habe.
|
Re: [SQL, firebird] "not in" Operator funktioniert
Du solltest Indices auf die beider Felder in Buchung setzen, die Du überprüfst.
Z. B. so:
SQL-Code:
Hope it helps
CREATE INDEX BUCHUNG_IDX1 ON BUCHUNG (VGNR);
CREATE INDEX BUCHUNG_IDX2 ON BUCHUNG (GSNR); onlinekater |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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