SQL Server: Wie alle untergeordneten Datensätze mit einer übergeordneten ID in einer sich selbst referenzierenden Tabelle abgerufen werden
Hallo, ich habe eine Tabelle, die die Verweise selbst und ich muss in der Lage sein wählen Sie die übergeordnete und alle untergeordneten Datensätze aus einer bestimmten übergeordneten Id.
Meine Tabelle ist wie folgt:
ID | ParentID | Name
-----------------------
1 NULL A
2 1 B-1
3 1 B-2
4 2 C-1
5 2 C-2
Also für das obige Beispiel würde ich gerne in der Lage, übergeben Sie einen Wert von 1 und erhalten alle Datensätze vor.
Bisher habe ich mit der folgenden rekursiven Tabellenwertfunktion aber es ist nicht verhält wie erwartet (nur die Rücksendung des ersten Datensatzes).
CREATE FUNCTION [dbo].[SelectBranches]
(
@id INT
,@parentId INT
)
RETURNS @branchTable TABLE
(
ID INT
,ParentID INT
,Name INT
)
AS
BEGIN
IF @branchId IS NOT NULL BEGIN
INSERT INTO @branchTable
SELECT
ID
,ParentID
,Name
FROM
tblLinkAdvertiserCity
WHERE
ID = @id
END
INSERT INTO @branchTable
SELECT
br.ID
,br.ParentID
,br.Name
FROM
@branchTable b
CROSS APPLY
dbo.SelectBranches(NULL, b.ParentID) br
RETURN
END
GO
InformationsquelleAutor der Frage Matthew Dresser | 2009-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, diese
InformationsquelleAutor der Antwort Adriaan Stander
Wenn Sie Oracle verwenden, deine Tabellenstruktur ist nicht geeignet für das beschriebene problem. Was Sie versuchen zu tun ist, schnappen Sie sich eine Hierarchie (Traversierung einer Baumstruktur).
Gibt es einen Artikel, Mehr Bäume & Hierarchien in SQLbeschreibt eine Methode zur Lösung des Hierarchie-Problems. Er im Grunde fügt eine "lineage" - Spalte beschreibt die Hierarchie auf jede Zeile an.
InformationsquelleAutor der Antwort Abtin Forouzandeh
Rekursion in
CTE
sieht bisschen teuer, also habe ich schrieb diese Funktion, die Verwendung rekursiver Funktionsaufruf, aber sehr viel schneller, dassCTE
Rekursion.InformationsquelleAutor der Antwort Ankush Madankar