usar traer solo repetir repetidos registros mostrar eliminar ejemplos duplicados dejando consultas consulta agrupar sql postgresql tree

solo - traer registros repetidos sql



Seleccionar filas de la tabla usando la orden de árbol (4)

Tengo una tabla que contiene campos: id, parent_id, name (etc.)

Quiero pedir esta tabla en "orden de viaje en árbol", es decir.

id parent_id 1, 0 3, 1 5, 1 2, 0 8, 2 4, 0 9, 4

(...)

describir brevemente: tomar el nodo raíz, agregar todos los elementos secundarios, tomar el siguiente nodo raíz, anexar elementos secundarios, etc.


Según su descripción, supongo que se refiere al orden de amplitud, que podría hacerse fácilmente utilizando una consulta WITH RECURSIVE (PostgreSQL 8.4+):

WITH RECURSIVE tree AS ( SELECT node_name, id, parent_id, NULL::varchar AS parent_name FROM foo WHERE parent_id IS NULL UNION SELECT node_name, f1.id, f1.parent_id, tree.node_name AS parent_name FROM tree JOIN foo f1 ON f1.parent_id = tree.id ) SELECT node_name, empno, parent_id, node_name FROM tree;

También puede usar el orden de primer orden usando el siguiente SQL:

WITH RECURSIVE tree AS ( SELECT node_name, id, parent_id, NULL::varchar AS parent_name, id::text AS path FROM foo WHERE parent_id IS NULL UNION SELECT node_name, f1.id, f1.parent_id, tree.node_name AS parent_name, tree.path || ''-'' || f1.id::text AS path FROM tree JOIN foo f1 ON f1.parent_id = tree.id ) SELECT node_name, empno, parent_id, node_name, path FROM tree ORDER BY path;


SELECT * FROM table ORDER BY id,parent_id

Eso debería ordenar mis columnas en el orden allí colocado dentro de la consulta.

A menos que quiera decir GROUP los artículos, creo que sí, use

SELECT * FROM table ORDER BY id GROUP BY parent_id

Y también te aconsejo que leas este artículo: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/


También puede usar el excelente módulo LTree , pero necesita reorganizar sus datos un poco.


Como lo notó sinérgico , la solución para el orden de profundidad proporcionada por Diogo Biazus no funcionará para identificadores con diferentes números de dígitos.

Pero puedes usar esta solución, que usa matrices de números enteros:

WITH RECURSIVE tree AS ( SELECT node_name, id, parent_id, NULL::varchar AS parent_name, array[id] AS path FROM foo WHERE parent_id IS NULL UNION SELECT node_name, f1.id, f1.parent_id, tree.node_name AS parent_name, tree.path || f1.id AS path FROM tree JOIN foo f1 ON f1.parent_id = tree.id ) SELECT node_name, empno, parent_id, node_name, path FROM tree ORDER BY path;