Select (Kreditor, Betrag, Bestelldatum, BK_Status, Erfasst_Name, Kommentar, Weiter_an_Kunde, KST_Verantwortlicher, Row_ID, PR_ID, ST_ID)
From Tab_Best Minus Select (Kreditor_Bezeichnung, Betrag, Bestelldatum, BK_Status, Benutzer, Text, Weiter_an_Kunde, KST_Verantwortlicher, Row_ID, processid, Step_ID
From Best_Recheing)
Ich will damit alle Datensätze aus der Tabelle Tab_Best haben Best_Recheing die nicht in der Best_Recheing sind. Jedoch nimmt er alle aus der Datensätze aus der Tab_Best. Kann mir wer helfe.
P.s. Über diesem Quellcode ist noch eine Insert anweisung da ich die daten in die Best_Recheing kopieren will.
Erst einmal ist das kein Quellcode und auch nix programmiertes sondern eine simple Abfrage zur Selektion.
Außerdem wäre es ganz interessant zu wissen, mit welchem DBMS du arbeitest. Mir ist nämlich kein Schlüsselwort MINUS bekannt. Und die Klammersetzung erscheint mir auch eigenartig. Warum ist in der zweiten Abfrage das FROM in der Klammer?
Und letztlich weiß das System doch gar nicht, dass Kreditor mit Kreditor_Bezeichnung, Benutzer mit Erfasst_Name, Kommentar mit Text, etc. pp. übereinstimmen.
Gibt es eigentlich eine ID, die jeden Datensatz eindeutig bestimmt? Ich nehme mal an, Row_ID ist eine solche ID. Bei MS SQL würde dann diese Abfrage zu dem gewünschten Ergebnis führen:
SELECT Kreditor, Betrag, Bestelldatum, BK_Status, Erfasst_Name, Kommentar, Weiter_an_Kunde, KST_Verantwortlicher, Row_ID, PR_ID, ST_ID FROM Tab_Best WHERE Row_ID NOT IN SELECT Row_ID FROM Best_Recheing
Außerdem wäre es ganz interessant zu wissen, mit welchem DBMS
du arbeitest.
Z.B. Oracle: www.plsql.de @ MINUS
Wenn man denn mit diesem Operator agiert…
Solcherlei Operatoren sind ursprünglich nicht im SQL-Standard enthalten, oder? Ich glaube, in der Uni haben wir uns immer auf den Standard beschränkt. MS SQL weicht zum Teil sehr stark vom Standard ab, weshalb ich recht ätzend finde, dass wir das in der Firma einsetzen.
Wenn ich das richtig sehe, muss er für seine Abfrage nur fleißig das Schlüsselwort AS einsetzen.
Abgesehen von Tippfehlern würde ich auf eine der folgenden Fehlerursachen tippen:
Missverständniss des Minus Operators: Minus vergleicht jeweils komplette Datensätze, und nicht etwa die IDs, den Primary Key oder dergleichen, dass heisst ein Datensatz aus dem ersten Select wird nur dann nicht selektiert, wenn er komplett und exakt in allen Spalten mit einem Datensatz aus dem zweiten Selekt übereinstimmt.
Formatierung (im weitesten Sinne): Wenn sich am Ende von Zeichenketten Leerzeichen eingeschlichen haben, oder Datumswerte mal als Date und mal als Varchar2 abgelegt werden kann das dazu führen, dass zwei Werte zwar identisch angzeigt werden, aber dennoch unterschiedlich sind. Wenn diese Hypotese zutrifft, müsste deine Ergebnismenge korrekt sein, wenn du nur einzelne Spalten betrachtest. Auf diese Weise kannst du dich an den Übeltäter herantasten.
Oracle has equivalent functionality for the following
subfeature:
E071-03, EXCEPT DISTINCT table operator: Use MINUS
instead of EXCEPT DISTINCT
schön, hat nur mit dem Standard nichts zu tun. Zum Standard gehört DISTINCT, nicht aber EXCEPT DISTINCT. Oracle hat hier für die Oracle-Erweiterung EXCEPT DISTINCT das Synonym MINUS geschaffen.
Der Unterschied zeigt sich schon in der Syntax, von der Funktion ganz zu schweigen:
_Select distinct from .
gegen
Select from
Minus select from .
und akademisch ist er ganz bestimmt nicht, sondern kommt
öfters mal ganz real zum Einsatz.
Meine Bewertung bezog sich ganz klar auf Dinge, die zum Standard gehören.
Hi Ralf,
so wie ich das lese behauptest du, Oracle würde behaupten den Standard nicht zu unterstützen, weil sie except distinct nicht unter diesem Namen implementiert haben, obwohl except distinct garnicht zum Standard gehört?
was Oracle behauptet, weiß ich nicht. MINUS ist ein Oracle-eigener Name für EXCEPT. EXCEPT ist im Draft SQL 2003 enthalten und wird wohl Standard werden, das kann ich aber nicht prüfen, weil es die entsprechende ISO dazu nur gegen Bares geben wird.