Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: SQL - Match
AUTOR BEITRAG
†ЯøjãnэЯ *www.mh-auto.de*

RANG Deckschrubber

#1 - 10.12 11:48

hi!
hab ein kleines access problem..

Ich hab 2 Tabellen, A & B.

Beide haben die gleiche Struktur, gleiche Spalten usw..
B enthält nur Zeilen die auch in A vorkommen.

Es sollen alle Zeilen (es reicht aus, wenn die ID gleich ist) die in A & B vorkommen in eine Tabelle C geschrieben werden. Also kurz gesagt "A minus B".

Code bisher:

SELECT * INTO C
FROM A INNER JOIN B ON A.ID1 = B.ID1;


Jedoch ist der code nicht ganz korrekt... denn er bringt mir alle datensätze aus A

Kann mir jemand weiterhelfen?
Vielen Dank!
Morath

RANG Deckschrubber

#2 - 10.12 12:15

moment, "A minus B" ist was anderes als "alle Zeilen, die in A & B vorkommen".

Dein Statement ist für letztere Aussage korrekt.

Für ein A \ B fällt mir grad folgendes ein, hoffentlich unterstützt deine Datenbank Subselects:

SELECT * INTO C
FROM A
WHERE A.ID NOT IN (SELECT ID FROM B);


edit: jetzt les ich grad noch das Wort "Access", da sollte der Subselect eigentlich funktionieren
†ЯøjãnэЯ *www.mh-auto.de*

RANG Deckschrubber

#3 - 10.12 12:23

funktioniert perfekt!

muchos gracias

-close-
Allanon // alex

CI-Chef

RANG Prophet of Clanintern

#4 - 10.12 19:29

du hättest doch nur deinen select mit einer bedingung asstatten müssen

SELECT * INTO C
FROM A INNER JOIN B ON A.ID1 = B.ID1
WHERE B.ID1 IS NOT NULL

damit werden nur die aus A genommen, die ein passendes gegenstück in B haben
damit gehts also ohne subselect
†ЯøjãnэЯ *www.mh-auto.de*

RANG Deckschrubber

#5 - 11.12 08:49

stimmt auch wieder :)

danke!
Morath

RANG Deckschrubber

#6 - 12.12 10:33

Allanon, das wär aber doch wieder genau das Gegenteil von dem was rauskommen soll?

WHERE B.ID1 IS NOT NULL heisst doch, dass ein gejointer Datensatz in B existieren muss. Der Ansatz sollte aber richtig sein, wenn du das NOT weglässt kommt man aufs gewünschte "A minus B"

Und wenn ichs mir recht überlege: der INNER JOIN stimmt doch auch nicht, oder? Der verbindet doch nur Datensätze, die auf _beiden_ Seiten vorhanden sind. Was wir hier bräuchten wäre ein LEFT OUTER JOIN.

Am besten schreib ich jetzt das komplette Statement nochmal hin:

SELECT A.* INTO C
FROM A LEFT OUTER JOIN B ON A.ID1 = B.ID1
WHERE B.ID1 IS NULL
Allanon // alex

CI-Chef

RANG Prophet of Clanintern

#7 - 12.12 12:47

stimmt natürlich ...
das NOT gehört da nicht rein ..
dennoch aber mit Innerjoin.. die daten die NUR in B stehen würde interessieren ja auch nicht
Morath

RANG Deckschrubber

#8 - 13.12 09:56

nein tut mir leid, der Inner Join ist falsch.

Ein Inner Join wählt nur die Datensätze aus, die sich in beiden Tabellen entsprechend der Joinbedingung gleichen. Die Bedingung ist dabei normalerweise ein Vergleich der Schlüsselwerte. Du wirst mit einem Inner Join niemals Datensätze bekommen, deren Schlüssel nur auf einer Seite des Joins vorkommen, Inner Join ist eine Schnittmenge beider Tabellen.

Probiers aus ;-)
Allanon // alex

CI-Chef

RANG Prophet of Clanintern

#9 - 13.12 14:18

genau das sagte ich doch
und nichts anders ist doch erwünscht?
die schnittmenge solls sein .. nicht aber die einträge die nur in einer der beiden tabellen sind..

oke ich denke es kann zu?
Morath

RANG Deckschrubber

#10 - 13.12 17:24

ich glaube wir missverstehen uns grad, es war keine Schnittmenge erwünscht sondern ein "A minus B", also alle Datensätze aus A, die nicht gleichzeitig in B enthalten sind. Genau das stellen der Ausdruck mit dem subselect und der mit dem left outer join dar.

Wie ich im ersten Satz von #2 schon geschrieben habe, ist #1 an einer Stelle falsch formuliert, weil sich die beiden Textstellen ja widersprechen.

Close ist aber auch ok, Trojaner war ja glücklich und zufrieden ;-)
†ЯøjãnэЯ *www.mh-auto.de*

RANG Deckschrubber

#11 - 14.12 09:14

genau :D

aber noch was anderes.. evtl kann mir jemand kurz erklären was ein "Left outer join" ist und wann mann sowas braucht..

bzw. für was man überhaupt den outer join braucht.. thx
Morath

RANG Deckschrubber

#12 - 14.12 15:23

Ein inner join wird genommen, um eine notwendige Beziehung zwischen zwei Tabellen herzustellen. Das heisst, dass nur Datensätze ausgewählt werden, die entsprechend der Joinbedingung zusammenpassen und dabei aber sowohl in der linken Tabelle existieren müssen, als auch in der rechten.

Der outer join ist jetzt sowas wie das Gegenteil davon: hier kommen auch Datensätze in die Ergebnismenge, die die Joinbedingung nicht erfüllen. Der entsprechend fehlende Teil der anderen Seite wird dann auf null gesetzt. Hierbei gibts drei Möglichkeiten:

- alles aus der linken Tabelle (LEFT OUTER JOIN, Abgekürzt auch als LEFT JOIN bekannt)
- alles aus der rechten Tabelle (RIGHT OUTER JOIN, kann ein LEFT OUTER JOIN werden, wenn man linke und rechte Tabelle tauscht. RIGHT JOIN wird deshalb kaum irgendwo erwähnt)
- alles aus beiden Tabellen (FULL OUTER JOIN)

Beispiele:

code:
Tabelle A
ID
--
1
2

Tabelle B
ID
--
1
3


inner join:
code:
SELECT A.ID, B.ID FROM A INNER JOIN B ON A.ID = B.ID

Ergebnismenge:
A.ID  B.ID
---------
1      1


left outer join:
code:
SELECT A.ID, B.ID FROM A LEFT OUTER JOIN B ON A.ID = B.ID

Ergebnismenge:
A.ID  B.ID
---------
1      1
2      null


right outer join:
code:
SELECT A.ID, B.ID FROM A RIGHT OUTER JOIN B ON A.ID = B.ID

Ergebnismenge:
A.ID  B.ID
---------
1      1
null   3


full outer join:
code:
SELECT A.ID, B.ID FROM A FULL OUTER JOIN B ON A.ID = B.ID

Ergebnismenge:
A.ID  B.ID
---------
1      1
2      null
null   3
†ЯøjãnэЯ *www.mh-auto.de*

RANG Deckschrubber

#13 - 14.12 15:38

viiiielen dank!