Consulta de SQL Server con nombres secundarios de la lista de árboles

Consulta de SQL Server con nombres secundarios de la lista de árboles en una columna y tabla de unión

Tengo 3 mesas:

Artículo:

Id, Name, Gropu, Measure, Price
----------------------------------
1, Coffee, 2, 1, 2.95
2, Tea, 2, 1, 1.95
3, CocaCola, 1, 1, 2,95

Medida:

Id, Name
---------
1, Cup

Grupo:

Id, ParentId, Name
----------------------
1, null, Beverages
2, 1, Hot beverages

Así que la idea es unir todas las tablas y obtener datos como en la siguiente tabla

Article.Id, Article.Name, Article.Group, Group.Name, Article.Measure, Measure.Name, Article.Price
-----------------------------------------------------------------------------------------------------
1, Coffee, 2, Beverages - Hot beverages, 1, Cup, 2.95
2, Tea, 2, Beverages - Hot beverages, 1, Cup, 1.95
3, CocaCola, 1, Beverages, 1, Cup, 2.95 

Todo lo que necesito es que obtuve en la misma columna todos los nombres de la jerarquía de la lista de árboles desde el nodo superior hasta el último para el artículo (en este ejemplo son solo 2 niveles pero en realidad pueden ser niveles infinitos)

Así que necesito en una columna todos los nombres de jerarquía con algo entre nombres como ' - ' de un artículo.

Espero que alguien tenga una consulta rápida porque tiene miles de artículos en la base de datos real

Mostrar la mejor respuesta

¿Por qué no ha escrito una consulta para obtener sus resultados? Eso es lo que yo haría.

Necesito una consulta, si sabes escribe en mi ejemplo.

Este es un sitio donde la gente responde preguntas... si necesita que alguien escriba código para usted, debe contratar a un desarrollador.

Necesito consulta rápida, para trabajar rápido, no consulta recursiva algo más rápido, no tengo ideas

Si ha escrito una consulta recursiva que funciona demasiado lentamente, debe publicarla y el plan de ejecución a partir de ella para que podamos ayudarlo con el problema real.

Para lo que quieres, no hay solución más rápida que una consulta recursiva.

inútil, escribe tu forma más rápida y lo intentaré, la palabra no significa nada

Te digo que no hay manera más rápida. Esa es la respuesta a tu pregunta. Dices que necesitas algo más rápido que una consulta recursiva.

en cuestión es solo un ejemplo, lo que necesito, obtuve 11 tablas en uniones (interior e izquierda) también agregar dinámicamente DONDE las condiciones dependen de los filtros de los usuarios

Nada de lo cual cambia mi respuesta. Una consulta recursiva sigue siendo su solución más rápida.

No estuve aquí más de 2 años, es hora de evitar esta 'ayuda' los próximos 4 años.

Primero, asegúrese de que no haya bucles en la jerarquía de su tabla de grupo y, si su tabla de grupo tiene muchos registros, asegúrese de que la tabla tenga un índice en Id (incluido el nombre) y otro índice en ParentId (que también incluya Nombre).

Entonces algo como esto (en realidad no se puede probar sin las definiciones de la tabla) debería funcionar:

;WITH GroupHierarchy AS
(
    -- Anchor
    SELECT
        GroupId = G.Id,
        ParentId = G.ParentID,
        GroupName = G.Name,
        HierarchyName = CONVERT(VARCHAR(MAX), G.Name),
        Level = 1
    FROM
        [Group] AS G
    WHERE
        G.ParentID IS NULL

    UNION ALL

    -- Children
    SELECT
        GroupId = G.Id,
        ParentId = G.ParentId,
        GroupName = G.Name,
        HierarchyName = R.HierarchyName + '-' + G.Name,
        Level = R.Level + 1
    FROM
        GroupHierarchy AS R
        INNER JOIN [Group] AS G ON R.GroupId = G.ParentId
)
SELECT
    A.Id, 
    A.Name, 
    A.[Group], 
    G.HierarchyName, 
    A.Measure, 
    M.Name, 
    A.Price
FROM
    Article AS A
    INNER JOIN Measure AS M ON A.Measure = M.Measure
    INNER JOIN GroupHierarchy AS G ON A.[Group] = G.[GroupId]
OPTION 
    (MAXRECURSION 1000) -- Your max recursion depth

Si sigue siendo lento, puede intentar crear una tabla física (o temporal) para almacenar los resultados de la recursividad usando SELECT INTO, creando un índice agrupado y uniéndose después.