Minus in Sql

Ich habe volgenden quellcode Programiert:

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.

Ich habe volgenden quellcode Programiert:

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

Beschäftige dich mal mit dem Schlüsselwort AS.

Bis denne
Schnoof

Hallo.

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…

mfg M.L.

Hallo.

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.

Bis denne
Schnoof

MS SQL weicht zum Teil sehr stark
vom Standard ab, weshalb ich recht ätzend finde, dass wir das
in der Firma einsetzen.

Meines Wissens gibt es keine Datenbank die den aktuellen SQL-Standard vollständig und korrekt unterstützt.

DB2 ist angeblich am dichtesten dran und die Schnittmenge zwischen Standard und Implementation ist auch bei MS und Oracle ziemlich groß.

Minus dürfte allerdings im Standard enthalten sein (reine Vermutung)

Jens

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.

MfG
Jens

Hi,
Ich hab dann doch einfach mal nachgeschaut (in der Oracle Doku der Version 10.1 bezüglich der Compliance zu Core SQL:2003)

Zitat:

Oracle has equivalent functionality for the following subfeature:
E071-03, EXCEPT DISTINCT table operator: Use MINUS instead of EXCEPT DISTINCT

Zitat Ende

Also:

  • Minus ist in der Tat kein Standard, (ein Glück das ich nicht wette, sonst hätte ich schon wieder Geld verloren :smile:
  • den Operator gibt es aber durchaus im Standard allerdings heisst er anders
  • und akademisch ist er ganz bestimmt nicht, sondern kommt öfters mal ganz real zum Einsatz.

MfG
Jens

Moin, Jens,

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.

Gruß Ralf_

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?

Irgendetwas verstehe ich an deiner Aussage nicht.

Jens

Hi Jens,

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.

Gruß Ralf