Benutzer mit den meisten Antworten
Frage zu einer SQL Abfrage

Frage
-
Hallo,
ich habe in einer MSSQL 2008 Express eine Tabelle, welche dazu dient, ein TreeView zu füllen. Dazu habe ich folgende Tabellenstruktur:
LID - bigint, PK
ParentID - bigint, ist der Vorgänger, also die LID des Vorgängers für das TreeView
Name - varchar
TypeArt - int, dient zur Selektierung
Nun benötige ich eine Abfrage, welche als Kriterium das feld "TypeArt" abfragt.
Select * from layouts where typeart=@TypeArt
Damit möchte ich nun wieder ein TreeView füllen, d. h., ich benötige auch alle Datenfelder rekursiv, welche als Vorgänger dienen (ParentID).
Gibt es dazu eine Möglichkeit, die Ergebnisse in einer SQL-Abfrage zu erhalten?
Gruß
Reiner
Antworten
-
Hallo Reiner,
Toplevel-Strukturen kannst Du am einfachsten mittels CTE abbilden. Das nachfolgende Beispiel habe ich mal anhand Deiner Anforderungen "versucht" :D
USE tempdb GO IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.tbl_TreeViewStructure', 'U')) DROP TABLE dbo.tbl_TreeViewStructure GO CREATE TABLE dbo.tbl_TreeViewStructure ( LId int NOT NULL IDENTITY(1, 1), ParentId int, NodeName nvarchar(128), CONSTRAINT pk_tbl_TreeViewStructure PRIMARY KEY NONCLUSTERED (LId) ) GO -- Eintragen von Testdaten INSERT INTO dbo.tbl_TreeViewStructure (ParentId, NodeName) VALUES (NULL, 'ParentNode1'), (NULL, 'ParentNode2'), (NULL, 'ParentNode3'), (1, 'ChildNode1'), (1, 'ChildNode2'), (2, 'ChildNode3'), (4, 'ChildChildNode1'), (4, 'ChildChildNode2') GO -- Nun mal die Strukture abbilden WITH TV_CTE AS ( SELECT ParentId, LId, NodeName FROM dbo.tbl_TreeViewStructure WHERE ParentId IS NULL UNION ALL SELECT t.ParentId, t.LId, t.NodeName FROM dbo.tbl_TreeViewStructure t INNER JOIN TV_CTE v ON (t.ParentId = v.LId) ) SELECT * FROM TV_CTE ORDER BY ParentId, NodeName
Mehr zu CTE findest Du hier:
http://msdn.microsoft.com/en-us/library/ms186243.aspx
http://msdn.microsoft.com/en-us/library/ms190766.aspxUwe Ricken
MCITP Database Administrator 2005
MCITP Database Administrator 2008
MCITP Microsoft SQL Server 2008, Database Development
db Berater GmbH
http://www-db-berater.de- Als Antwort vorgeschlagen Lars Schweer Dienstag, 6. März 2012 08:34
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. März 2012 11:36
Alle Antworten
-
Hallo Reiner,
Toplevel-Strukturen kannst Du am einfachsten mittels CTE abbilden. Das nachfolgende Beispiel habe ich mal anhand Deiner Anforderungen "versucht" :D
USE tempdb GO IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.tbl_TreeViewStructure', 'U')) DROP TABLE dbo.tbl_TreeViewStructure GO CREATE TABLE dbo.tbl_TreeViewStructure ( LId int NOT NULL IDENTITY(1, 1), ParentId int, NodeName nvarchar(128), CONSTRAINT pk_tbl_TreeViewStructure PRIMARY KEY NONCLUSTERED (LId) ) GO -- Eintragen von Testdaten INSERT INTO dbo.tbl_TreeViewStructure (ParentId, NodeName) VALUES (NULL, 'ParentNode1'), (NULL, 'ParentNode2'), (NULL, 'ParentNode3'), (1, 'ChildNode1'), (1, 'ChildNode2'), (2, 'ChildNode3'), (4, 'ChildChildNode1'), (4, 'ChildChildNode2') GO -- Nun mal die Strukture abbilden WITH TV_CTE AS ( SELECT ParentId, LId, NodeName FROM dbo.tbl_TreeViewStructure WHERE ParentId IS NULL UNION ALL SELECT t.ParentId, t.LId, t.NodeName FROM dbo.tbl_TreeViewStructure t INNER JOIN TV_CTE v ON (t.ParentId = v.LId) ) SELECT * FROM TV_CTE ORDER BY ParentId, NodeName
Mehr zu CTE findest Du hier:
http://msdn.microsoft.com/en-us/library/ms186243.aspx
http://msdn.microsoft.com/en-us/library/ms190766.aspxUwe Ricken
MCITP Database Administrator 2005
MCITP Database Administrator 2008
MCITP Microsoft SQL Server 2008, Database Development
db Berater GmbH
http://www-db-berater.de- Als Antwort vorgeschlagen Lars Schweer Dienstag, 6. März 2012 08:34
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. März 2012 11:36
-
Hallo Rebelhig,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.