SQL-Alias verknüpften Tabellen
Ich habe eine Abfrage wie diese:
select a1.name, b1.info
from (select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)
Ich will nur alles einschließen, wobei a1.status=1 und da bin ich mit einem outer-join, ich kann nicht fügen Sie einfach eine where
Einschränkung auf Tabelle1, weil alle Infos aus Tabelle2, dass ich will, ausgeschlossen zu werden immer noch da sein, nur eben ohne den Namen. Ich dachte, so etwas wie dieses:
select z1.name, z1.info
from ((select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)) as z1
where z1.status = 1
aber ich glaube nicht, dass das legal ist.
BEARBEITEN:
Wie unten beschrieben, eine äußere Verknüpfung eigentlich gar keinen Sinn für das, was ich versuche zu tun. Was ist, wenn, zum Beispiel, ich möchte alle Daten aus Tabelle2 where status!=1 in Tabelle1, inklusive aller Daten, wobei eine entsprechende ID gar nicht vorhanden sind in Tabelle1. Somit bräuchte ich eine outer-join alle Daten aus Tabelle2, aber immer noch wollen, schließen Sie diese Einträge, bei denen der status=1.
Entspricht:
select z1.name, z1.info
from ((select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)) as z1
where z1.status != 1
In Reaktion auf einige Ihrer Kommentare - ich glaube nicht, dass Sie verstehen, wie die
JOIN
s arbeiten. Ein LEFT OUTER JOIN
zeigt Ihnen alle Datensätze in der ersten Tabelle, und dann alle passenden Datensätze aus der zweiten (oder NULL
wenn es nicht passt). Ein RIGHT OUTER JOIN
genau das Gegenteil tut - Sie alle Datensätze aus Tabelle 2, passend nur in Tabelle 1. Ein INNER JOIN
zeigt dir nur, wo die Kriterien matches/Sätze existieren in BEIDEN Tabellen.Tatsächlich, ich verstehe ganz gut, was ein Join tut. Ich war zunächst Holen Sie die Daten aus Tabelle2 mit der rechten outer-join, um sicherzustellen, dass ich bekam, dass alle Daten, unabhängig davon, ob eine entsprechende ID vorhanden in Tabelle1. Seitdem habe ich beschlossen, ich brauchte nur die Daten von denen, die aktiv waren, die gekennzeichnet ist von "Tabelle1" den status. Ich habe versucht, diese änderungen ohne zu merken, dass bei einem outer-join wird sinnlos, wenn ein entsprechender Datensatz mit einem aktiven status gibt es in "Tabelle1".
Super, ich hatte nicht die Absicht, herablassend oder beleidigend, wenn ich stieß auf diese Weise. Joins sind eine der am häufigsten missverstandenen Aspekte von SQL, das ist alles 🙂
Keine Sorge, meine Frage war nicht gerade sehr sinnvoll, logisch, so sehe ich, wie Sie es nehmen könnte als mein eigenes Missverständnis des Konzepts. Ich denke, dass meine überarbeitete Frage macht Sinn, obwohl.
InformationsquelleAutor Lincecum | 2010-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem right outer join macht genau das gleiche wie ein left outer join, nur mit den Tabellen umgeschaltet. Sie können filter auf die Verknüpfung und es wird immer noch die Daten enthalten, die von der ersten Tabelle.
InformationsquelleAutor Dustin Laine
Fügen Sie die
where
- Klausel, um diesubquery
wie diese:InformationsquelleAutor Samuel Neff
EDIT:
Ihre zweite Szenario:
Funktionieren sollte, da bekommen Sie alle Tabelle2 Daten unabhängig.
EDIT 2:
OK, alles von Tabelle2 sei denn, es gibt eine status-ID in Tabelle 1, auch wenn es nicht ein Eintrag in Tabelle1, müssen Sie die
EXCEPT
- Funktion, die im Grunde ausschließen, eine Teilmenge aus einer größeren Datenmenge.Gibt es einen anderen Grund, die Sie benötigen, zu tun, ein
RIGHT OUTER JOIN
auf diese statt der linken oder inneren? In den meisten Fällen eineRIGHT JOIN
ist so ziemlich nie genannt.Nicht wirklich, solange es einen äußeren join
Machen Sie es eine
LEFT OUTER JOIN
und das problem ist gelöst, es sei denn, Sie müssen verwaiste Datensätze aus der Tabelle2.Ich wollte, dass alle Datensätze aus Tabelle2 zunächst, bis ich erkannte, dass es nicht wirklich sinnvoll in diesem Szenario. Noch habe ich das Gefühl, es könnte ein Szenario, wo ich wünschen würde, zu check-Einschränkungen nach der Durchführung eines outer-Joins ist, und ich glaube nicht, dass jede der Lösungen zu lösen. Vielleicht ist das Szenario einfach nicht vorhanden, obwohl.
InformationsquelleAutor JNK