14. juli 2005 - 16:01Der er
6 kommentarer og 1 løsning
SQL der fanger menuer i menusystem
Hi E,
Jeg har et menusystem, hvor hvert menupunkt relaterer sig til den ovenoverliggend menu via et parent id:
punkt 1 [id=1,parentid=NULL] punkt 1.1 [id=2,parentid=1] punkt 1.2 [id=3,parentid=1] punkt 2 [id=4,parentid=NULL] punkt 2.1 [id=5,parentid=4] punkt 2.1.1 [id=6,parentid=5] punkt 2.2 [id=7,parentid=4] punkt 3 [id=8,parentid=NULL] ... ...
Hvordan konstruerer jeg en stykke SQL, der fx kan fange punkt 2 og alle underliggende punkter? Kan jeg bruge en form for en løkke der tjekker om et givent punkts id anvendes som parentid af andre punkter?
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Du kan lave en cursor hvor du kører dem igennem hvor parentid er NULL, for hver af dem henter du så dem der har parentid = det id du er nået til i cursoren.
nej, faktisk ikke. jeg har dog også haft andre ting at tage mig til ;-) vil afprøve din løsning en af dagene, så jeg venter lige lidt med at slutte spørgsmålet
-- Createing the temporary table in which the menus for deletion is placed. CREATE TABLE #menu_table (menu INT PRIMARY KEY)
-- Inserting the initial menu: MenuUI = @menu INSERT INTO #menu_table (menu) VALUES(@menu)
-- Declare the variables to store the values returned by FETCH. DECLARE @menutodelete INTEGER, @parent INTEGER, @menutolookup INTEGER, @rowsadded INTEGER
-- Declare the cursor for the initial SELECT (child element for ParentUI=@menu) DECLARE menu_cursor CURSOR FOR SELECT MenuUI FROM tblMenu WHERE ParentUI=@menu
OPEN menu_cursor
-- Going to first row and asigning value to variable FETCH NEXT FROM menu_cursor INTO @menutodelete
-- Inserting child menus into temporary table for later use WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO #menu_table (menu) VALUES(@menutodelete) FETCH NEXT FROM menu_cursor INTO @menutodelete END
CLOSE menu_cursor DEALLOCATE menu_cursor
-- Looping through temporary table and declaring cursor for child elements (discarting existing child elements)
DECLARE table_cursor CURSOR FOR SELECT menu FROM #menu_table WHERE menu<>@menu
OPEN table_cursor FETCH NEXT FROM table_cursor INTO @menutolookup
WHILE @@FETCH_STATUS = 0 BEGIN
-- Declare the second cursor for the children DECLARE menu_cursor2 CURSOR FOR SELECT MenuUI FROM tblMenu WHERE ParentUI=@menutolookup AND MenuUI<>@menutolookup
OPEN menu_cursor2
-- Going to first row and asigning value to variable FETCH NEXT FROM menu_cursor2 INTO @menutodelete
-- Looping through cursor and inserting new menus where ParentUI = MenuUI for child elemens (from temporary table) WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO #menu_table (menu) VALUES(@menutodelete) FETCH NEXT FROM menu_cursor2 INTO @menutodelete
END
CLOSE menu_cursor2 DEALLOCATE menu_cursor2
FETCH NEXT FROM table_cursor INTO @menutolookup
END
CLOSE table_cursor DEALLOCATE table_cursor
-- Creating cursor for deletion DECLARE menu_cursor3 CURSOR FOR SELECT * FROM #menu_table
OPEN menu_cursor3 FETCH NEXT FROM menu_cursor3 INTO @menutodelete
WHILE @@FETCH_STATUS = 0 BEGIN DELETE FROM tblMenu WHERE MenuUI=@menutodelete FETCH NEXT FROM menu_cursor3 INTO @menutodelete END
Hvis der er nogen, der kan optimere sætningen, er jeg lutter øre (fx kunne man sætte NOCOUNT for at spare lidt servertid).
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.