SELECT * die nicht in tabelle b sind

Hallo Wissende, ich komme irgendwie nicht weiter… wahrscheinlich ist es richtig simpel.

Ich habe mehrere Tabellen die ich hinter weg joine, und jetzt ist eine dazu gekommen die werte enthält die nicht ausgegeben werden sollen. Also von der logik wäre das so

t.a JOIN t.b ON …
t.b JOIN t.c ON …
t.c JOIN t.d ON …
t.a JOIN t.x ON a.opNr = x.opNr

Wobei die Ergebnismänge nur die enthalten darf die nicht in t.x gefunden wurden. Wie mache ich das? Ich steh echt auf dem Schlauch,
danke und grüße,
indyk

selbst ist der mann
Ich habs ( ;

t.a JOIN t.x ON (a.OpNr != x.OpNr)

Hi,

Ich habs ( ;

das glaube ich eher nicht.

t.a JOIN t.x ON (a.OpNr != x.OpNr)

ich kann mir kaum vorstellen, dass du das wirklich willst: Das Ergebnis ist das kartesische Produkt minus der Sätze, wo a.OpNr=x.OpNr.

Was Du vermutlich willst ist ein outer join.

SELECT \* FROM t1, t2
WHERE t1.id = t2.id(+) AND t2.id IS NULL;

Gruß
Martin

ich kann mir kaum vorstellen, dass du das wirklich willst: Das
Ergebnis ist das kartesische Produkt minus der Sätze, wo
a.OpNr=x.OpNr.

Aber genau das will ich, vll. habe ich mich im ersten Post undeutlich ausgedrückt.

Ein Beispiel zum verständnis:
Tabelle A

ID OpNR
1 0001
2 0002
3 0003
4 0004

Tabelle X

ID OpNr
1 0003

Das Produkt wäre dann

ID OpNR
1 0001
2 0002
4 0004

Hallo Indyk,

ich kann mir kaum vorstellen, dass du das wirklich willst: Das
Ergebnis ist das kartesische Produkt minus der Sätze, wo
a.OpNr=x.OpNr.

Aber genau das will ich, vll. habe ich mich im ersten Post
undeutlich ausgedrückt.

Mal ehrlich: hast Du deinen Select auch mit genau den Daten hier ausprobiert? Und der bringt genau das gewünschte Ergebnis? Hast Du auch schon einmal in X einen zweiten Satz eingefügt? Geht’s dann immer noch?

Ein Beispiel zum verständnis:
Tabelle A

ID OpNR
1 0001
2 0002
3 0003
4 0004

Tabelle X

ID OpNr
1 0003

 5 0004

Das Produkt wäre dann

ID OpNR
1 0001
2 0002
4 0004

Das Produkt wäre (mit dem zweiten Satz in X) erst einmal

A(ID) A(OpNr) X(ID) X(OpNr)
1 0001 1 0003
2 0002 1 0003
3 0003 1 0003 \*
4 0004 1 0003
1 0001 5 0004
2 0002 5 0004
3 0003 5 0004
4 0004 5 0004 \*

Die mit * markierten Sätze fallen wegen A(OpNr) = X(OpNr) raus, dir bleiben also 6 Sätze übrig; ich vermute aber du wolltest nur zwei, oder? Bei nur einem Satz in X funktioniert das natürlich „zufällig“ trotzdem…

Gruß
Martin

Ok zugegeben, es funktioniert nur bei einem Datensatz… das ist natürlich schlecht, aber es ändert ja nichts an dem Ausgangspunkt wie ich es haben möchte.

Da wir ja nun beide wissen das mein Ansatz in die Hose gegangen ist… wäre ich für einen neuen sehr dankbar ( :

danke für deine mühe und zeit.

Hallo Indyk,

Da wir ja nun beide wissen das mein Ansatz in die Hose
gegangen ist… wäre ich für einen neuen sehr dankbar ( :

wusste ich’s doch *gg*

Dein Problem lässt sich auf mehrere Arten lösen.

(1) Der Outer Join
Ich kenne die ISO-Syntax für den Outer Join leider nicht, unter Oracle würde es so aussehen:

SELECT \* FROM t1, t2 WHERE t1.x = t2.x(+)

Der Select bringt jetzt alle Sätze, die entweder in t1 und t2 mit gleichem x drin sind, oder aber nur in t1 und in t2 keinen Match haben.
Mit der zusätzlichen Einschränkung:

SELECT \* FROM t1, t2 WHERE t1.x = t2.x(+) AND t2.x IS NULL

findet er nur mehr die, wo es in t2 keinen Match gibt.

(2) Der Subselect

(2a) mit EXISTS

SELECT \* FROM t1 WHERE NOT EXISTS (SELECT \* FROM t2 WHERE t2.x=t1.x)

(2b) mit IN

SELECT \* FROM t1 WHERE x NOT IN (SELECT x FROM t2)

Die Ergebnisse der drei SELECTs sind übrigens nicht in jedem Fall gleich. Wann das der Fall ist darfst Du Dir aber gerne selbst überlegen :wink: [Ein Tipp: NULL]

danke für deine mühe und zeit.

Aber gerne doch.

Lg
Martin

1 Like