Wie wählen Eltern und Kinder, die Zeilen in SQL Server
Möchte ich wählen Sie alle itens Zusammenhang user_id 53 (Eltern und Kinder) aus der folgenden Tabelle. Es sollte: 1, 2, 4, 8, 9.
my_table
--------------------------------------------
id parent_id user_id sequence depth
--------------------------------------------
1 null 50 1 1
2 1 52 1.2 2
3 1 52 1.3 2
4 2 53 1.2.4 3
5 2 52 1.2.5 3
6 3 52 1.3.6 3
7 3 51 1.3.7 3
8 4 51 1.2.4.8 4
9 4 51 1.2.4.9 4
Mit CTE konnte ich wählen Sie alle Kinder oder Eltern, aber ich konnte nicht wählen Kinder und Eltern mit nur einem query. Unten ist die cte-ich bin mit auswählen Kindern.
Element und Kinder
with cte as (
select t.id, t.parent_id, t.user_id
from my_table t
where t.user_id=53
union all
select t.id, t.parent_id, t.user_id
from my_table t
inner join cte c on (c.parent_id=t.id)
)
select t.* from cte t;
Element und Eltern
with cte as (
select t.id, t.parent_id, t.user_id
from my_table t
where t.user_id=53
union all
select t.id, t.parent_id, t.user_id
from my_table t
inner join cte c on (c.id=t.parent_id)
)
select t.* from cte t;
Dank.
InformationsquelleAutor Diogo Arenhart | 2013-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es sehr bequem, dass Sie die Sequenzen. Die Eltern haben ein sequence-matching eine erste Teilmenge der eine, die Sie suchen. Das gleiche gilt für die Kinder, aber in umgekehrter Richtung.
Dem folgenden nahe kommt, was Sie wollen:
Aber Sie müssen vorsichtig sein, mit
10
passenden1
zum Beispiel. So, fügen wir eine zusätzliche Frist gegebenenfalls:denken wie Sie, wir können es auch tun, mit vorhanden ist: wählen Sie mt.* aus meine_tabelle mt where exists(select id from my_table theone, wo user_id=53-und (mt.id=theone.id oder mt.Reihenfolge wie theone.Sequenz+ '.%' oder theone.Reihenfolge wie mt.Sequenz + '.%'))
Ja, ich denke, so etwas würde auch funktionieren.
InformationsquelleAutor Gordon Linoff
Das problem hier ist, dass Sie möchten eine rekursive
SELECT
. Ein DBMS ist nicht gemacht für eine solche Abfrage. Aber es ist natürlich auch möglich.Diese Abfrage würde Ihnen jeden 1. Grades.
Für eine rekursive AUSWÄHLEN, dann schau mal hier: Rekursiv wählen Sie in SQL
Lösung für Ihre Anfrage: http://sqlfiddle.com/#!6/e1542/10/0
ja, es kann, weiß ich. Aber es ist anstrengend für die Datenbank 😉 .. ich postete auch die Lösung mit einer sql fiddle. ... Und wenn du gelesen hättest, die ersten 3 Sätze meiner Antwort, die Sie gesehen haben, würden die Worte
But it's of course possible.
Aber Sie schrieb auch: "Ein DBMS ist nicht gemacht für eine solche Abfrage" das ist nicht wahr. Und die erste Aussage nicht, was Diogo will (leider kann ich nicht widerrufen, meine downvote - bekomme ich nur "nicht gesperrt").
Es ist definitiv nicht gemacht für diese Art von operation. Es kann Hunderte bis Tausende von einzelnen SELECT-Abfragen (jeweils einschließlich eine VERKNÜPFUNG), wenn der Baum-Hierarchie wird größer.
Eine rekursive gespeicherte Prozedur wird weniger effizient. Und es kommt auf das DBMS. Oracle rekursive Verarbeitung ist extrem schnell.
InformationsquelleAutor Benjamin M