Muszę śledzić dane w SQL Server 2008 R2. SQLFiddle
Schemat:
CREATE TABLE [dbo]. [ICFilters] ( [ICFilterID] [int] TOŻSAMOŚĆ (1,1) NIE NULL, [ParentID] [int] NOT NULL DEFAULT 0, [FilterDesc] [varchar] (50) NOT NULL, [Aktywny] [tinyint] NOT NULL DEFAULT 1, CONSTRAINT [PK_ICFilters] PODSTAWOWY KLUCZ ZESTAWIONY ([ICFilterID] ASC) Z PAD_INDEX = WYŁ., STATISTICS_NORECOMPUTE = WYŁ., IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) W dniu [PODSTAWOWY] ) W dniu [PODSTAWOWY] INSERT INTO [dbo]. [ICFilters] (ParentID, FilterDesc, Active) Wartości (0, „typ produktu”, 1), (1, „ProdSubType_1”, 1), (1, „ProdSubType_2”, 1), (1, „ProdSubType_3”, 1), (1, „ProdSubType_4”, 1), (2, „PST_1.1”, 1), (2, „PST_1.2”, 1), (2, „PST_1.3”, 1), (2, „PST_1.4”, 1), (2, „PST_1.5”, 1), (2, „PST_1.6”, 1), (2, „PST_1.7”, 0), (3, „PST_2.1”, 1), (3, „PST_2.2”, 0), (3, „PST_2.3”, 1), (3, „PST_2.4”, 1), (14, „PST_2.2.1”, 1), (14, „PST_2.2.2”, 1), (14, „PST_2.2.3”, 1), (3, „PST_2.8”, 1)
Stół:
| ICFILTERID | RODZICIEL | FILTERDESC | AKTYWNE | -------------------------------------------------- | 1 | 0 | Rodzaj produktu | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 3 | 1 | ProdSubType_2 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 20 | 3 | PST_2.8 | 1 |
Każdy wiersz ma identyfikator swojego rodzica i katalogu głównego parentid = 0
. Są FilterDesc
to tylko przykładowe opisy, więc nie mogę parsować tych do zamówienia.
Pytanie
Czy można wybrać wszystkie wiersze w sposób podobny do drzewa? Jeśli tak to jak? Kiedy mówię „drzewko”, mam na myśli rekurencyjnie wybranie rodzica, a następnie wszystkich jego dzieci, a następnie wszystkich dzieci każdego z nich i tak dalej. Głębokie przejście przez drzewo.
Ja i moi przyjaciele próbowaliśmy, ale nie udało nam się rozwiązać problemu, ale nadal będziemy próbować. Jestem całkiem nowy w sql, więc może to można zrobić łatwo i po prostu robię wszystko trudniejszym niż to konieczne.
Przykład (pożądany) wynik:
| ICFILTERID | RODZICIEL | FILTERDESC | AKTYWNE | -------------------------------------------------- | 1 | 0 | Rodzaj produktu | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 3 | 1 | ProdSubType_2 | 1 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 20 | 3 | PST_2.8 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 |
źródło
Odpowiedzi:
OK, wystarczająca liczba komórek mózgowych jest martwa.
SQL Fiddle
źródło
[FilterDesc]
kolumnie są fikcyjne, a kolejność jest niepotrzebna / nieważna. Zgodnie z logiką w odpowiedzi @Travis Gan, wszystko, co trzeba zrobić, aby uzyskać taką kolejność, to dodać kolejnąCAST
doLevel
. na przykład.Level + CAST( CAST(i.[ICFilterID] AS varbinary(max)) AS Level
StajeLevel + CAST(i.[FilterDesc] AS varbinary(max)) + CAST(i.[ICFilterID] AS varbinary(max)) AS Level
.Powyższe wydaje mi się nie działać poprawnie. Wyobraź sobie konfigurację z dwoma tabelami z danymi typu Facebook. Tabela 1 zawiera PostId + inne pola. PostId to automatyczne zwiększanie i oczywiście w interfejsie posortujesz DESC, aby mieć najnowszy post na górze.
Teraz tabela komentarzy. Tabela 2 Ta tabela CommentId jest kluczem podstawowym, numerem auto. W swoim gui chcesz wyświetlić ASC, aby podczas czytania wątku miało to sens. (najstarsza (mniejsza liczba) u góry) Inne ważne klucze w tabeli 2 to: PostId (FK z powrotem do postów) i ParentId (FK do CommentId), gdzie ParentId będzie NULL, jeśli jest to komentarz „root” do posta. Jeśli ktoś ODPOWIADA na komentarz, wówczas parentId zostanie wypełniony komentarzem.
Mam nadzieję, że dostaniecie dryf. CTE będzie wyglądać następująco:
Próbka wyjściowa
Na F / B post 105 pojawiły się dwa komentarze (CommentIds 1 i 2) Ktoś następnie odpowiedział na Comment1 (CommentId 5, ParentId 1), a następnie ktoś inny skomentował tę odpowiedź, więc na Comment5 (CommentId 6, ParentId 6)
I viola, sekwencja jest poprawna, pod postem możesz teraz wyświetlać komentarze we właściwej kolejności. Aby wciąć posty, aby tworzyły się i konstruowały jak na Facebooku (im głębszy poziom, tym bardziej musi być margines od lewej), mam również kolumnę o nazwie Wcięcie. Korzenie są równe 0, a następnie w unii mamy c. Wcięcie + 1 AS Wcięcie W kodzie możesz teraz pomnożyć wcięcie przez załóżmy 32px i wyświetlaj komentarze w ładnej hierarchii i zarysie.
Nie widzę problemu z użyciem klucza podstawowego automatycznego przyrostu CommentId jako siły napędowej do zbudowania mojego klucza SortKey, ponieważ jest lepsza zmiana twojego zepsucia dat (komentowania) niż zepsucia klucza zarządzanego przez bazę danych, który zaczyna się od +1
źródło
To da ci wszystkich potomków i poziom.
Mam nadzieję że to pomoże :)
źródło