Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL EXCEPT Ersatz (https://www.delphipraxis.net/199074-sql-except-ersatz.html)

FediDelPr 21. Dez 2018 17:31

Datenbank: ACCESS • Version: div / 2016 • Zugriff über: ADO

SQL EXCEPT Ersatz
 
Hallo miteinander

Wenn ich das richtig sehe ist das SQL Statement EXCEPT in ACCESS nicht verfügbar.

Kann mir jemand eine intelligente (schnelle) Ersatzlösung aufzeigen ?

Danke vielmals.

mkinzler 21. Dez 2018 17:35

AW: SQL EXCEPT Ersatz
 
Kennt ACCESS
SQL-Code:
NOT IN
?

FediDelPr 21. Dez 2018 17:46

AW: SQL EXCEPT Ersatz
 
Danke @mkinzler

ich denke auf den Punkt gebracht ist es:

https://stackoverflow.com/questions/...-except-clause

Antwort 3

jobo 21. Dez 2018 18:47

AW: SQL EXCEPT Ersatz
 
Ich bin überrascht!

Das ist eine sanft verkürzte Darstellung von Except nicht nur in Antwort 3.

Except betrifft alle Felder aus der Select Clause (wie UNION und ähnliche)! Die Lösung für ein Ersatz-Statement über Where Conditions betrifft also verschieden viele Felder in direkter Abhängigkeit von der Anzahl der Felder der Select Clause.

Liefert man ein Beispiel-"Workaround", dessen Select Clause nur ein Feld enthält ist der "Workaround" trivial.

FediDelPr 21. Dez 2018 19:16

AW: SQL EXCEPT Ersatz
 
NOT IN funktioniert grundsätzlich. Speed wird später abgeklärt.

Die Varianten gemäss Stackoverflow sind bei mir noch nicht lauffähig.

FediDelPr 21. Dez 2018 19:24

AW: SQL EXCEPT Ersatz
 
Ich möchte noch ein Lob aussprechen:

Das Forum Delphi-Praxis finde ich toll. Ich bin überrascht wie schnell
hier Antwort kommt. Die Antworten sind in vielen Fällen auch qualifiziert.
Die DELPHI Community scheint nach wie vor recht gross zu sein, das freut mich,
sehe ich doch keine wirkliche Alternative zu PASCAL (MODULA-2, OBERON).

jobo 21. Dez 2018 20:11

AW: SQL EXCEPT Ersatz
 
Zitat:

Zitat von FediDelPr (Beitrag 1421699)
NOT IN funktioniert grundsätzlich.
Die Varianten gemäss Stackoverflow sind bei mir noch nicht lauffähig.

"Not In" ist Standard, funktionieren wird es auf jeden Fall!

Stackoverflow zeigt nur einfache (einspaltige) Beispiele, der Spaß geht ja erst ab 2++ los.
Aber vielleicht baut der Access Assistent das ja richtig auf, ist ja nur "Fleißarbeit".

p80286 21. Dez 2018 22:29

AW: SQL EXCEPT Ersatz
 
Werden mit
Code:
EXCEPT
nicht vollständige Datensätze verglichen?
Da dürfte der "Nachbau" mit
Code:
not in
ganz schön aufwendig werden.
Aber was tut man nicht alles um zu zeigen, daß Access eine richtige Datenbank ist.8-)

Gruß
K-H

FediDelPr 22. Dez 2018 00:03

AW: SQL EXCEPT Ersatz
 
In meiner Anwendung braucht tatsächlich nur eine Spalte überein zu stimmen. Die
nicht übereinstimmenden interessieren mich dann.

Auf den ersten Blick scheint die Variante mit einem (LEFT) JOIN gegenüber derjenigen
mit NOT IN wesentlicher leistungsfähiger zu sein.

jobo 22. Dez 2018 04:00

AW: SQL EXCEPT Ersatz
 
@80286: Ja, es werden "vollständige" Datensätze verglichen, wobei vollständig sich schlicht auf die im Select genannten Spalten bezieht (ID-artige oder FK Felder will man dort idR nicht drin haben)

Wahrscheinlich liegt hier eine Mussverständnis zur Anwendung der SQL Funktionen vor.
Not In sowie left join (mit not null) haben nichts mit Except zu tun.

Beispiel für Except:
Code:
insert into customeractive (lastname, firstname, street, city) values
('Ambach','Albert','Amtsstraße','Aachen'),
('Bertold','Belinda','Bahnhofstraße','[B]Barlin[/B]'),
('Christen','Christina','Carlsonstr','Castrop-Rauxel'),
('Düsentrieb','Daniel','Dagobertstraße','Darmstadt');

insert into customerimport (lastname, firstname, street, city) values
('Ambach','Albert','Amtsstraße','Aachen'),
('Bertold','Belinda','Bahnhofstraße','[B]Berlin[/B]'),
('Christen','Christina','Carlsonstr','Castrop-Rauxel'),
('Düsentrieb','Daniel','Dagobertstraße','Darmstadt');
--zeige neu oder geändert
select firstname, lastname, street, city from customerimport
except
select firstname, lastname, street, city from customeractive;
ergibt:
firstnamelastnamestreetcity
BelindaBertoldBahnhofstraßeBerlin
ChristinaChristenCarlsonstrCastrop-Rauxel

Except ist ein ~"exkludierendes Union"***, die Mengenlehre würde wahrscheinlich Differenzmenge sagen.
Es ist offensichtlich, dass hier keine Join Clause verwendet wird. **

(Not) In <werteliste> ist wahrscheinlich für den Einsatz von kleineren Wertelisten gedacht (enums) und entsprechend optimiert*.
(left) join dagegen für den Abgleich von "endlosen" Relationen gemacht und optimiert*.

Mit diesem jeweils speziellen Einsatzzweck ergeben sich dann ggF. Laufzeitunterschiede und evtl. sogar verfahrensbedingte Limitierungen. Ich fasse "(not) in" in SQL kaum an. Mehr als 5 Einträge im Enum, da fragt man sich doch, ob das nicht Werte sind, die in eine Tabelle gehören. Ja und lahm ist es meist auch.

* "optimiert für" ist hier jeweils idealerweise kein Stück statischer Code, sondern mehr oder weniger optimale, dynamisch gewählte Ausführungspfade vor dem tatsächlichen Start der Abfrage, jeweils mit Focus enum oder join
** an der Stelle Verweise ich mal auf den anderen aktuellen Thread "..inner joins.." und den dort bereits aufgeführten Link zu Venn Diagramms. Da kann sich jeder seine ideologische Ecke selbst aussuchen oder dazu einen neuen Thread eröffnen.
*** selbsterfundenener Begriff um die Analogien zu Union zu verdeutlichen, "Differenzmenge" dagegen ist ein echtes Mathewort(Mengenlehre).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.

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