es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta SQL para número jerárquico.

Aquí tienes los datos:

CREATE TABLE dbo.Correspondents
(
    ID smallint NOT NULL,
    ParentID smallint NULL,
    Name nvarchar(30)  NOT NULL,
    OrderNumber int NOT NULL
);

INSERT INTO dbo.Correspondents VALUES 
 (1, null, 'A', 1),
 (2, 1, 'B', 2),
 (3, 1, 'C', 3),
 (4, 2, 'D', 1);

Y el resultado que quiero:

ID|Name|NumeroJerarquico
1 |   A|   1
2 |   B|   1.2
3 |   C|   1.3
4 |   D|   1.2.1

La clave es que cada entrada tiene su propio número de orden, pero la consulta debe devolver un número jerárquico que contenga todos los números de los padres como una subsecuencia delimitada por punto, con el propio número al final. La característica principal requiere la capacidad de proporcionar un número jerárquico para cualquier entrada, por lo que la consulta debe ser capaz de recibir un ID de la entrada y devolver un número jerárquico para ella. El DBMS es MSSQL 2017.
¡Gracias de antemano!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución mediante Consulta Recursiva

    Para resolver este problema, necesitamos utilizar una consulta recursiva para obtener la jerarquía de cada entrada. Podemos utilizar la característica CTE (Expresión de Tabla Común) de SQL para implementar una consulta recursiva. Aquí está la consulta SQL para obtener el número jerárquico de cada entrada:

    WITH Hierarchy AS
    (
        SELECT 
          ID,
          Name,
          CAST(OrderNumber AS VARCHAR(MAX)) AS HierarchicalNumber
        FROM 
          dbo.Correspondents 
        WHERE 
          ParentID IS NULL
    
        UNION ALL
    
        SELECT 
          c.ID,
          c.Name,
          CAST(h.HierarchicalNumber + '.' + CAST(c.OrderNumber AS VARCHAR(MAX)) AS VARCHAR(MAX)) AS HierarchicalNumber
        FROM 
          dbo.Correspondents AS c
          INNER JOIN Hierarchy AS h ON h.ID = c.ParentID
    )
    SELECT ID, Name, HierarchicalNumber FROM Hierarchy
    

    El código SQL anterior define una CTE llamada “Hierarchy” que inicialmente obtiene todas las entradas de nivel superior (aquellas sin un padre). Luego, obtiene recursivamente las entradas hijo utilizando una unión con la CTE “Hierarchy”. La función CAST se utiliza para crear el número jerárquico concatenando el “HierarchicalNumber” del padre con el “OrderNumber” de la entrada actual. Finalmente, la consulta selecciona el “ID”, “Name” y “HierarchicalNumber” de la CTE “Hierarchy”.

    Para obtener el número jerárquico de una entrada específica, puedes utilizar el siguiente código SQL:

    SELECT HierarchicalNumber FROM Hierarchy WHERE ID = 4
    

    Esta consulta devolverá el número jerárquico para la entrada con “ID” = 4.

    ¡Espero que esta solución sea útil!

Comments are closed.