Eine Tabelle zur anderen hinzufügen
-
Hey, ich möchte habe in meinen Unteranfragen 2 Tabellen und die möchte ich jetz zusammenfügen damit ich darauf ein where anwenden kann. Ist das möglich?
also ich habe Tabelle A und Tabelle B und ich will AB haben also ich glaube kein joinen es soll alles so bleiben wie es ist nur die Tabellen zusammenfügen.
-
Ja, das geht so:
SELECT ... FROM ( SELECT c1, c2, c3 FROM A UNION ALL SELECT c1, c2, c3 FROM B ) as Foo WHERE ...
Das in Klammern ist das "A+B". Das "Foo" dahinter ist der Name für die virtuelle Tabelle die dadurch entsteht. Den musst du angeben, auch wenn du ihn nicht brauchen solltest.
Im "äusseren" SELECT kannst du dann ganz normal tun, als ob Foo eine Tabelle wäre wo "A+B" drinnensteht.
Natürlich kannst du aus dem inneren Teil auch eine View machen, dann muss du den nicht in allen Abfragen wo er gebraucht wird immer ausschreiben.
-
Sorry ich habe mich falsch ausgedrückt ich meinte sowas:
Ich habe bis jetzt folgendes Schema
A | B
v1 | v2
--------------------------------------------------------------
Daten: a | b
b | c
a | a (Die zeile brauch ich also wenn v1 = v2)ACHTUNG die Tabellen sind noch nicht zusammen also bis jetz exestiert nur die beiden Unteranfragen (select....)as A und (select....)as B !
Wenn ich inner join benutze kommt auch die Zeile ab und bc
Da b auch in der Menge B enthalten ist.Sorry wenn ich irgendwelchen unverständlichen mist schreibe aber ich verzweifel grad einwenig
-
Also mal sehen ob ich das richtig verstehe...
Du hast zwei Tabellen, A und B.
A hat genau eine Spalte, namens "v1", und folgenden Inhalt:[v1] ------- a b a
B hat auch genau eine Spalte, namens "v2", und folgenden Inhalt:
[v2] ------- b c a
Jetzt willst du die Zeilen in A und B quasi "nebeneinander" legen, und dann nur die Zeilen haben wo v1 == v2? Stimmt das so weit?
Dann hast du nämlich ein Problem. Und zwar das Problem, dass Zeilen in einer Tabelle keine definierte "Position" (Zeilennummer) haben.
D.h. du kannst nicht die "erste" Zeile aus A mit der "ersten" Zeile aus B verknüpfen, weil es keine "erste" Zeile in einer Tabelle gibt.Klar, du bekommst die Zeilen bei jedem SELECT in irgendeiner Reihenfolge zurück. Und ja, diese Reihenfolge ist auch meist die selbe wenn du das SELECT mehrfach hintereinander ausführst. Und ja, die Reihenfolge entspricht oft auch genau der in der die Zeilen eigegeben wurden.
Bloss wenn die Datenbank mal auf die Idee kommt die Tabelle physikalisch zu reorganisieren, dann hast du ein Problem. Dann würfelt es nämlich u.U. diese schöne Reihenfolge komplett durcheinander.
Boom, you're dead.Du musst also deinen Zeilen irgendeinen "Namen" verpassen, damit du sie identifizieren kannst. Das muss jetzt kein String sein, aber halt irgendwas über das du die Zeile identifizieren kannst. Im einfachsten Fall eine Nummer.
Und so bald du sowas hast, kannst du dieses Feld (bzw. die Felder, können ja auch mehrere sein) verwenden, um die beiden Tabellen A und B zu joinen. Und dann, nachdem sichergestellt ist dass die "richtigen" Zeilen aus A und B "sich finden", kannst du dein "WHERE v1 = v2" schreiben.
Das sieht dann einfach so aus
SELECT * FROM A INNER JOIN B ON A.theUniqueRowName = B.theUniqueRowName -- sicherstellen dass die richtigen Zeilen zusammenfinden WHERE A.v1 = B.v2 -- deine Filterbedingung
Ferdich.
p.S.:
Dieses "Namen Feld" ergibt sich normalerweise auch ganz von selbst. Denk einfach mal darüber nach, was du mit der Reihenfolge der Zeilen verbindest - also was die bedeuten soll. Das muss irgendwas sein. Ist es die Position in einer Rangliste, sortiert nach irgendeinem Krietrium? Eine zeitliche Abfolge? ...? Irgend etwas gibt es da, das gerne ein Feld geworden wäre, das du aber weggelassen hast.