2011-11-05 15 views
10

Estoy tratando de escribir mi consulta de SQL Server 2008 de tal forma que pueda simplemente recorrer mis encabezados de salida y salida según sea necesario. He hecho esto de la manera incorrecta muchas veces y ColdFusion hizo el trabajo duro dentro de la página, pero necesito esto en SQL Server.¿Cómo ordeno por padre y luego hijo?

FeatureID ParentID Feature 
-------------------------- 
1   0  Apple  
2   0  Boy 
3   2  Charles 
4   1  Daddy 
5   2  Envelope 
6   1  Frankfurter 

Quiero que mi consulta de resultados para parecerse a esto:

FeatureID ParentID Feature 
-------------------------- 
1   0  Apple  
4   1  Daddy 
6   1  Frankfurter 
2   0  Boy 
3   2  Charles 
5   2  Envelope 

Si el ParentID es 0, significa que se trata de una de las categorías principales. Si el ParentID es mayor que 0, significa que es una categoría menor, un hijo del padre.

Por lo que los padres deben solicitarse A - Z y los niños deben solicitarse A-Z.

¿Me puede ayudar a ordenar esto correctamente?

SELECT FeatureID, ParentID, Feature 
FROM Features 
ORDER BY 
+0

¿Por qué es Boy con ParentID 0 ordenadas por debajo Frankfurter con ParentID 1? – Andomar

+0

Porque quiero dar salida al padre y luego a sus hijos y luego al siguiente padre y luego a sus hijos. –

+1

intente de esta manera mucho más simple: http://stackoverflow.com/questions/13382380/mysql-order-by-parent-and-child – Otak

Respuesta

9

Desde su comentario, si usted sabe que sólo hay dos niveles, hay una fácil solución:

select * 
from @Features feat 
order by 
     case 
     when ParentID = 0 
     then Feature 
     else (
       select Feature 
       from @Features parent 
       where parent.FeatureID = feat.ParentID 
       ) 
     end 
,  case when ParentID = 0 then 1 end desc 
,  Feature 
  1. Ordenar por el nombre del elemento raíz: para la raíz, esto es la columna de funciones. Para los niños, busque el nombre de la raíz con una subconsulta.
  2. Ordenar la raíz en la parte superior
  3. clasificar a los niños por su nombre

Example at SE Data.

+0

Jeepers !!! Eso es mucho código para algo que parece que debería ser MUCHO más directo. Tu ejemplo parece funcionar bien. Esto es más engorroso que hacerlo de otra manera. –

+0

Sí, forma de código de producción complicado. Esperaba que alguien más publicara una solución más simple. Tenga en cuenta que podría simplificar enormemente el código si estuviera limitado a una profundidad determinada, por ejemplo, un máximo de 2 nodos entre la raíz y la hoja – Andomar

+0

. En realidad, solo habrá dos niveles, principal e secundario. No habrá abuelo o nietos. –

6

para MySQL, que puede probar: (con la condición ParentID de su hijo es FeatureID de su ParentID)

SELECT FeatureID, ParentID, Feature 
FROM Features 
ORDER BY case when ParentID=0 then FeatureID else ParentID end * 1000 + FeatureID ASC 
+0

+1 Esto funciona bien siempre que la tabla esté en orden alfabético, y no tenga más de 999 filas – Andomar

+1

¿No debería ser esto simplemente? ORDEN POR CASO CUANDO ParentID = 0 THEN FeatureID ELSE ParentID END ASC, FeatureID ASC 'en su lugar? Porque entonces todavía usará índices y también no estará limitado a 999 registros. Pero sí, esto falla si tiene '(7, 8, 'bar')' y '(8, 0, 'foo')', ('SELECT COUNT (1) FROM Características WHERE FeatureID Seph

Cuestiones relacionadas