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üssenSELECT * 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 dochund 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 :Daber 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:
inner join:
left outer join:
right outer join:
full outer join:
|
||||||||||
†ЯøjãnэЯ *www.mh-auto.de*
RANG Deckschrubber |
#13 - 14.12 15:38 viiiielen dank! |
||||||||||