Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#1

Baumzusammenstellung mit Hilfe von SQL (MS SQL)

  Alt 16. Aug 2006, 13:42
Ausgehend von diesem Thread, hier mal die Version für MsSQL...

Folgende Tabelle habe ich für den Baum angelegt...
SQL-Code:
CREATE TABLE [nodes] (
   [id] [int] NOT NULL ,
   [parentid] [int] NULL ,
   [Bezeichnung] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
   [Reihenfolge] [int] NOT NULL ,
   CONSTRAINT [PK_nodes] PRIMARY KEY CLUSTERED
   (
      [id]
   ) ON [PRIMARY]
) ON [PRIMARY]
Beispielinhalt...
SQL-Code:
+----+----------+-----+-------------+
| id | parentid | bez | reihenfolge |
+----+----------+-----+-------------+
| 1 | NULL | A | 1 |
| 2 | 1 | AA | 1 |
| 3 | 1 | AB | 2 |
| 4 | NULL | B | 2 |
| 5 | 4 | BA | 1 |
| 6 | 4 | BB | 2 |
| 7 | 1 | AC | 3 |
| 8 | 7 | ACA | 1 |
+----+----------+-----+-------------+
Dann habe ich folgende Prozedur angelegt...
SQL-Code:
CREATE PROCEDURE proc_node (@ParentID INT, @NurBlaetter BIT) AS

DECLARE @id INT
DECLARE @bezeichnung VARCHAR(1000)

DECLARE cursor_nodes CURSOR LOCAL FOR
  SELECT id, bezeichnung
  FROM nodes
  WHERE COALESCE(parentid, 0) = @ParentID
  ORDER BY reihenfolge

OPEN cursor_nodes
FETCH NEXT FROM cursor_nodes INTO @id, @bezeichnung
WHILE @@FETCH_STATUS = 0 BEGIN
  IF (SELECT COUNT(*) FROM nodes WHERE parentid = @id) = 0
     OR @NurBlaetter = 0
  BEGIN
    INSERT INTO ##temp (ID, Bezeichnung) VALUES (@id, @bezeichnung)
  END
  EXEC proc_node @id, @NurBlaetter

  FETCH NEXT FROM cursor_nodes INTO @id, @bezeichnung
END

CLOSE cursor_nodes
DEALLOCATE cursor_nodes
und dann diese Prozedur...
SQL-Code:
CREATE PROCEDURE proc_main (@ParentID INT, @NurBlaetter BIT) AS

CREATE TABLE ##temp (
  ID INT,
  Bezeichnung VARCHAR(1000)
)

EXEC proc_node @ParentID, @NurBlaetter
SELECT *
FROM ##temp

DROP TABLE ##temp
Ausgabe des gesamten Baums...
SQL-Code:
EXEC proc_main 0, 0

+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 1 | A |
| 2 | AA |
| 3 | AB |
| 7 | AC |
| 8 | ACA |
| 4 | B |
| 5 | BA |
| 6 | BB |
+------+-------------+
Ausgabe aller Elemente und Unterelemente, die zum Element mit der ID = 1 gehören...
SQL-Code:
EXEC proc_main 1, 0

+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 2 | AA |
| 3 | AB |
| 7 | AC |
| 8 | ACA |
+------+-------------+
Ausgabe des gesamten Baums (nur die Blätter)...
SQL-Code:
EXEC proc_main 0, 1

+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 2 | AA |
| 3 | AB |
| 8 | ACA |
| 5 | BA |
| 6 | BB |
+------+-------------+
Ausgabe aller Blatt-Elemente, die zum Element mit der ID = 1 gehören...
SQL-Code:
EXEC proc_main 1, 1

+------+-------------+
| ID | Bezeichnung |
+------+-------------+
| 2 | AA |
| 3 | AB |
| 8 | ACA |
+------+-------------+
Lieder ist die maximale Rekursionstiefe bei MsSQL 32, tiefere Baumstrukturen sind dadurch leider nicht möglich. (Bei MySQL kann bzw. muss man diesen Wert manuell setzen)

Gruss
Thorsten

[edit=CalganX]Titel und Klassifizierung angepasst. Mfg, CalganX[/edit]
  Mit Zitat antworten Zitat