2014-03-04 2 views
0

asp.net의 SQL 데이터 소스에서 계층 적 메뉴를 만드는 데 사용하려고합니다. asp.net에서 메뉴를 쉽게 만들 수 있도록 테이블을 정렬하는 데 문제가 있습니다. 누구나 아이디어가있는 경우 더 좋은 방법이있을 수 있습니다.SQL을 사용하여 asp.net의 계층 적 메뉴 만들기

현재이 모양의 표가 있으며 (예제 데이터 구성) 루트에만 폴더가 있고 폴더에만 폴더가있을 수 있습니다. IDS :

+-------------------+---------------------+-----------+-----------+ 
| Name_FolderorItem | Parent_Folder  | Id_Folder | Menuplace | 
+-------------------+---------------------+-----------+-----------+ 
| c FOLDER   | ROOT    | c_FOLDER | 1   | 
| d FOLDER   | j_FOLDER   | d_FOLDER | 2   | 
| a FOLDER   | ROOT    | a_FOLDER | 1   | 
| j FOLDER   | ROOT    | j_FOLDER | 1   | 
| f FOLDER   | ROOT    | f_FOLDER | 1   | 
| r FOLDER   | f_FOLDER   | r_FOLDER | 2   | 
| i FOLDER   | d_FOLDER   | i_FOLDER | 3   | 
| a ITEM   | j_FOLDER   |   | 2   | 
| d ITEM   | c_FOLDER   |   | 2   | 
| z ITEM   | f_FOLDER   |   | 2   | 
| r ITEM   | d_FOLDER   |   | 3   | 
+-------------------+---------------------+-----------+-----------+ 

내가 주문하는 경우는 각각의 깊은 수준에 다음 알파벳 첫 번째 수준에 알파벳되는이를 얻을 수 있다고 생각 해요 :

+-------------------+---------------------+-----------+-----------+ 
| Name_FolderorItem | Parent_Folder  | Id_Folder | Menuplace | 
+-------------------+---------------------+-----------+-----------+ 
| a FOLDER   | ROOT    | a_FOLDER | 1   | 
| c FOLDER   | ROOT    | c_FOLDER | 1   | 
| d ITEM   | c_FOLDER   |   | 2   | 
| f FOLDER   | ROOT    | f_FOLDER | 1   | 
| r FOLDER   | f_FOLDER   | r_FOLDER | 2   | 
| z ITEM   | f_FOLDER   |   | 2   | 
| j FOLDER   | ROOT    | j_FOLDER | 1   | 
| a ITEM   | j_FOLDER   |   | 2   | 
| d FOLDER   | j_FOLDER   | d_FOLDER | 2   | 
| i FOLDER   | d_FOLDER   | i_FOLDER | 3   | 
| r ITEM   | d_FOLDER   |   | 3   | 
+-------------------+---------------------+-----------+-----------+ 

그럼 내가 얻을 수있는 목록보기를 사용할 수 있습니다 이 메뉴 구조 :

a FOLDER 
c FOLDER 
- d ITEM 
f FOLDER 
- r FOLDER (r FOLDER is located in f folder) 
- z ITEM 
j FOLDER 
- a item 
- d FOLDER 
- - i FOLDER 
- - r ITEM 

폴더를 가져 와서 그 레벨의 다른 폴더/항목 대신 폴더의 내용을 우선 순위 지정하는 데 필요한 SQL을 알아낼 수 없습니다. 사전에 내가 감사하겠습니다이 주문을 허용 것이 SQL 문, 덕분에 어떤 아이디어가 있다면

편집 : 여기 은 도움말

주셔서 감사합니다 내가 지금 사용하고 쿼리입니다
SELECT * 
FROM table 
START WITH Parent_Folder LIKE 'ROOT' 
CONNECT BY PRIOR Id_Folder LIKE Parent_folder; 

답변

1

이것은 기본적으로 데이터베이스에 주문 나무에게를 저장하는 문제이다. 나는 과거에 몇 가지 방법을 시도하고이 일 추천 :

----------------------------------- 
| NodeID | ParentID | Order | 
----------------------------------- 
| 1  |  -1 |  1 | 
| 2  |  1 |  1 | 
| 3  |  1 |  2 | 
| 4  |  3 |  1 | 
----------------------------------- 

요점을 각 행 트리에서 노드 (또는 귀하의 경우 메뉴 항목)에 해당하고, 그것이 parentID을 가지고입니다 부모를 가리킨다. 루트 노드는 null 또는 -1을 가지므로 parentID를가집니다. 이제 루트 바로 아래에있는 모든 노드, 당신은

SELECT * FROM table WHERE ParentID = -1 ORDER BY [Order] 

가 [주문] 어떻게 특정 부모 노드에서 직접의 노드를 주문하는 방법을 알려줍니다 사용하십시오 얻을 수 있습니다. (좋아, SQL 키워드를 사용하여 열 이름을 지정하는 것은 좋지 않지만 그 순간을 잊어 버리자.) 따라서 나의 예에서는 "2"와 "3"이 루트 아래에 있음을 볼 수 있지만 "2"가 먼저옵니다. 바로 "3"(즉 자식)에서 노드를 선택하려면이 메뉴를 조회 쉽게이 방법의 장점은

SELECT * FROM table WHERE ParentID = 3 ORDER BY [Order] 

을 사용하십시오. 단점은 업데이트 할 때 동일한 ParentID를 공유하는 노드 (즉, 동일한 부모 아래에 있음)가 [Order] 이름을 공유하지 않도록해야한다는 것입니다.

다른 방법은 링크 목록 같은 무언가로 트리를 저장하는 것입니다

대체 방법 : 당신의 나무가 매우 크고 빠르게 형제를 찾아 볼 필요가

----------------------------------- 
|NodeID | ParentID | PrevID  | (optionally you can store NextID as well) 
----------------------------------- 
| 1  | -1  | -1   | 
| 2  | 1  | -1   | 
| 3  | 1  | 2   | 
| 4  | 3   | -1   | 
----------------------------------- 

경우 이러한 접근 방식은 더 나은 성능을 제공합니다.

+1

+1 아마도 하나의 검색어로 모든 어린이를 표시하기위한 계층 적 CTE를 언급하고 싶을 수도 있습니다. http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL –

+0

두 분 모두에게 감사 드리며, 저는 이전에 개별 검색어로이를 수행하는 방법을 알고있었습니다. ,하지만 Fabian의 정확히 내가 뭘 필요했는지 대답을 내 질문을 편집 할 것입니다. – user3220901

+0

전체 트리를 한 번에 표시해야하는 경우 왜 XML 파일보다는 데이터베이스에 저장할 것이라고 궁금해? xml은 관리하기가 훨씬 쉽습니다. 트리가 매우 큰 경우 (예 : 깊이가 최소 8 인 1000 개 이상의 노드) 매우 느립니다. – kevin

관련 문제