Tengo que seguir los datos en SQL Server 2008 R2. SQLFiddle
Esquema:
CREATE TABLE [dbo]. [ICFilters] ( [ICFilterID] [int] IDENTITY (1,1) NOT NULL, [ParentID] [int] NO NULL DEFAULT 0, [FilterDesc] [varchar] (50) NO NULL, [Activo] [tinyint] NO NULO POR DEFECTO 1, RESTRICCIÓN [PK_ICFilters] CLAVE PRIMARIA CLUSIFICADA ([ICFilterID] ASC) CON PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ENCENDIDO [PRIMARIO] ) ENCENDIDO [PRIMARIO] INSERT INTO [dbo]. [ICFilters] (ParentID, FilterDesc, Active) Valores (0, 'Tipo de producto', 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)
Mesa:
El | ICFILTERID | PARENTID | FILTERDESC | ACTIVO | -------------------------------------------------- El | 1 | 0 | Tipo de producto | 1 | El | 2 | 1 | ProdSubType_1 | 1 | El | 3 | 1 | ProdSubType_2 | 1 | El | 4 | 1 | ProdSubType_3 | 1 | El | 5 | 1 | ProdSubType_4 | 1 | El | 6 | 2 | PST_1.1 | 1 | El | 7 | 2 | PST_1.2 | 1 | El | 8 | 2 | PST_1.3 | 1 | El | 9 | 2 | PST_1.4 | 1 | El | 10 | 2 | PST_1.5 | 1 | El | 11 | 2 | PST_1.6 | 1 | El | 12 | 2 | PST_1.7 | 0 | El | 13 3 | PST_2.1 | 1 | El | 14 3 | PST_2.2 | 0 | El | 15 | 3 | PST_2.3 | 1 | El | 16 3 | PST_2.4 | 1 | El | 17 | 14 PST_2.2.1 | 1 | El | 18 14 PST_2.2.2 | 1 | El | 19 14 PST_2.2.3 | 1 | El | 20 | 3 | PST_2.8 | 1 |
Cada fila tiene la ID de su padre y la raíz parentid = 0
. Los FilterDesc
s son solo descripciones de muestra, así que no puedo tratar de analizarlos para ordenarlos.
La pregunta
¿Es posible seleccionar todas las filas en forma de árbol? ¿Si es así, cómo? Cuando digo 'en forma de árbol', me refiero a seleccionar recursivamente el padre seguido de todos sus hijos, luego todos los hijos de cada uno de ellos y así sucesivamente. Una profundidad del primer recorrido del árbol.
Mis amigos y yo lo hemos intentado, pero nos hemos quedado cortos de soluciones de trabajo, pero seguiremos intentándolo. Soy bastante nuevo en SQL, así que tal vez esto se pueda hacer fácilmente y solo estoy haciendo las cosas más difíciles de lo necesario.
Ejemplo de salida (deseada):
El | ICFILTERID | PARENTID | FILTERDESC | ACTIVO | -------------------------------------------------- El | 1 | 0 | Tipo de producto | 1 | El | 2 | 1 | ProdSubType_1 | 1 | El | 6 | 2 | PST_1.1 | 1 | El | 7 | 2 | PST_1.2 | 1 | El | 8 | 2 | PST_1.3 | 1 | El | 9 | 2 | PST_1.4 | 1 | El | 10 | 2 | PST_1.5 | 1 | El | 11 | 2 | PST_1.6 | 1 | El | 12 | 2 | PST_1.7 | 0 | El | 3 | 1 | ProdSubType_2 | 1 | El | 13 3 | PST_2.1 | 1 | El | 14 3 | PST_2.2 | 0 | El | 17 | 14 PST_2.2.1 | 1 | El | 18 14 PST_2.2.2 | 1 | El | 19 14 PST_2.2.3 | 1 | El | 15 | 3 | PST_2.3 | 1 | El | 16 3 | PST_2.4 | 1 | El | 20 | 3 | PST_2.8 | 1 | El | 4 | 1 | ProdSubType_3 | 1 | El | 5 | 1 | ProdSubType_4 | 1 |
fuente
Respuestas:
Bien, suficientes células cerebrales están muertas.
Violín de SQL
fuente
[FilterDesc]
columna son ficticios y ese orden es innecesario / sin importancia. Siguiendo la lógica en la respuesta de @Travis Gan, todo lo que se debe hacer para obtener este pedido es agregar otroCAST
alLevel
. p.ej.Level + CAST( CAST(i.[ICFilterID] AS varbinary(max)) AS Level
Se convierteLevel + CAST(i.[FilterDesc] AS varbinary(max)) + CAST(i.[ICFilterID] AS varbinary(max)) AS Level
.Lo anterior no parece funcionar correctamente para mí. Imagine una configuración de 2 tablas con datos de tipo Facebook. La Tabla 1 tiene PostId + otros campos. PostId es de incremento automático y, obviamente, en su interfaz, ordenará DESC para tener la última publicación en la parte superior.
Ahora para la tabla de comentarios. Tabla 2 Esta tabla CommentId es la clave principal, el número automático. En su interfaz gráfica de usuario, desea mostrarlo ASC, para que cuando lea el hilo, tenga sentido. (el más antiguo (número más pequeño) en la parte superior) Otras claves importantes en la tabla 2 son: PostId (FK a las publicaciones) y ParentId (FK a CommentId) donde ParentId será NULL si este es el comentario "raíz" en una publicación. Si alguien RESPONDE en un comentario, el parentId se completará con el commentid.
Espero que ustedes se enteren. El CTE se verá así:
Salida de muestra
En la publicación F / B 105, hubo dos comentarios (CommentIds 1 y 2) Alguien respondió el Comment1 (CommentId 5, ParentId 1), y luego alguien más comentó esa respuesta, así que Comment5 (CommentId 6, ParentId 6)
Y viola, la secuencia es correcta, debajo de la publicación, ahora puede mostrar los comentarios en la secuencia correcta. Para sangrar las publicaciones de modo que se formen y delineen como en Facebook (cuanto más profundo es el nivel, más debe ser marginado desde la izquierda), también tengo una columna llamada Sangría. Las raíces son 0 y luego en la unión, tenemos c.Indent + 1 AS Indent En el código, ahora puede multiplicar la sangría con supongamos 32px y mostrar los comentarios en una buena jerarquía y esquema.
No veo ningún problema al usar la clave primaria de incremento automático CommentId como la fuerza impulsora para construir mi SortKey, ya que hay un mejor cambio en las fechas de desorden (comentario) que la desorganización de una clave administrada de base de datos que se inicia con +1
fuente
Esto te dará todos los descendientes y el nivel.
Espero que esto ayude :)
fuente