SQL Server’da Recursive Menü Oluşturmak
Herkese merhaba. Bu yazıda SQL Server’da Recursive Menü oluşturmak ile ilgili bilgi vermeye çalışacağım.
SQL Server’da menü basit ya da gelişmiş şekilde iç içe menüler oluşturabilirsiniz.
Öncelikle, “Menu” adında bir tablo oluşturalım.
CREATE TABLE Menu (
MenuID INT PRIMARY KEY
,MenuName NVARCHAR(50)
,ParentMenuID INT NULL
,FOREIGN KEY (ParentMenuID) REFERENCES Menu (MenuID)
);
Daha sonra, tabloya en az 10 adet menü ve alt menü içeriği ekleyelim.
INSERT INTO Menu (MenuID, MenuName, ParentMenuID)
VALUES (1, 'Ana Menü 1', NULL),
(2, 'Ana Menü 2', NULL),
(3, 'Alt Menü 1.1', 1),
(4, 'Alt Menü 1.2', 1),
(5, 'Alt Menü 1.3', 1),
(6, 'Alt Menü 2.1', 2),
(7, 'Alt Menü 2.2', 2),
(8, 'Alt Menü 2.3', 2),
(9, 'Alt Menü 2.4', 2),
(10, 'Alt Menü 2.5', 2);
Bu örnekte, “MenuID” sütunu benzersiz bir menü kimliği olarak kullanılmıştır. “MenuName” sütunu, menü adını içerir. “ParentMenuID” sütunu ise bir alt menüyü ana menüye bağlamak için kullanılır. Alt menülerin “ParentMenuID” değeri, ilgili ana menünün “MenuID” değerine eşit olmalıdır. Ana menülerin “ParentMenuID” değeri NULL olarak ayarlanır.
SQL Server’da bir tabloda ana menülerin alt menülerle ilişkilendirilmesi için özyinelemeli bir sorgu kullanabiliriz.
Aşağıdaki örnek, ana menü ve alt menülerin ilişkilendirildiği bir tabloyu hiyerarşik olarak göstermektedir.
WITH RecursiveMenu
AS
(SELECT
MenuID
,MenuName
,ParentMenuID
,MenuLevel = 0
,MenuPath = CAST(MenuName AS NVARCHAR(MAX))
FROM Menu
WHERE ParentMenuID IS NULL
UNION ALL
SELECT
m.MenuID
,m.MenuName
,m.ParentMenuID
,MenuLevel = rm.MenuLevel + 1
,MenuPath = CAST(rm.MenuPath + ' > ' + m.MenuName AS NVARCHAR(MAX))
FROM Menu AS m
INNER JOIN RecursiveMenu AS rm
ON m.ParentMenuID = rm.MenuID)
SELECT
MenuID
,MenuName
,MenuLevel
,MenuPath
FROM RecursiveMenu
ORDER BY MenuPath;
Yukarıdaki sorguyu çalıştırınca aşağıdakine benzer bir sonuç göreceksiniz.
Görüldüğü üzere basit şekilde Recursive menü oluşturmuş olduk.
Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.