none
DESAFIO com CTE (Common Table Expression) RRS feed

  • Pergunta

  • Pessoal, tenho o seguinte desafio pra vocês:

    Eu tenho uma tabela onde eu tenho um campo que chamo de 'JOB' e outro que chamo de 'ANTECESSOR'. Antecessor, como o próprio nome diz, é o pai do JOB que está ao seu lado. (quando ele n tem antecessor, logo é um dos primeiros, ou o primeiro a ser executado). Por exemplo:

    JOB - ANTECESSOR - POSIÇÃO

      A   -    '       '        -   NULL 

      B   -      A             -   NULL

    'A' é o JOB raíz, o primeiro ... e 'B' é o JOB logo abaixo de 'A', então 'A' é pai de 'B'.

    Eu tenho a seguinte consulta com uma query que foi definida com inserções aleatórias. Quero organizá-la na ordem a partir do JOB raíz, ou seja, o primeiro a ser executado pra baixo. Eu criei uma CTE mas ela não funciona para essa ordem que inserí na consulta abaixo (vocês verão que o JOB 'XB' vai ficar como último a ser executado, no entanto isso n é possível pois ele possui como antecessor o job 'A', q é o primeiro a ser executado). Espero que vocês possam me ajudar nesse desafio de organizar a tabela por seus antecessores

    CREATE

    TABLE CTRL_M2 (

    Job

    varchar(50),

    Antecessor

    varchar(50),

    Posicao

    int

    );

    insert

    into CTRL_M2 values ('B', 'A', null)

    insert

    into CTRL_M2 values ('C', 'B', null)

    insert

    into CTRL_M2 values ('B', 'AB', null)

    insert

    into CTRL_M2 values ('XB', 'A', null)

    insert

    into CTRL_M2 values ('XC', 'A', null)

    insert

    into CTRL_M2 values ('E', 'D', null)

    insert

    into CTRL_M2 values ('ZB', '-', null)

    insert

    into CTRL_M2 values ('ZA', '-', null)

    insert

    into CTRL_M2 values ('D', 'C', null)

    insert

    into CTRL_M2 values ('A', '-', null)

    insert

    into CTRL_M2 values ('AB', '-', null)

    select

    * from CTRL_M2

    with

    CTE as

    (

    SELECT s.Job, s.Antecessor,

    Posicao

    = CASE WHEN s.Antecessor like '-' THEN 1 END

    FROM CTRL_M2 s

    UNION ALL

    SELECT s.Job, s.Antecessor,

    Posicao

    = CASE WHEN s.Antecessor like '-' THEN 1 END

    FROM CTRL_M2 s join cte as x on x.Job = s.Antecessor

    WHERE s.Antecessor is not null

    )

    select

    distinct Job, Antecessor,Posicao from CTE order by Posicao DESC 


    • Editado AlexAugustus quarta-feira, 22 de janeiro de 2014 18:05
    quarta-feira, 22 de janeiro de 2014 17:55

Respostas

  • Deleted
    • Marcado como Resposta AlexAugustus quarta-feira, 22 de janeiro de 2014 18:37
    • Não Marcado como Resposta AlexAugustus quarta-feira, 22 de janeiro de 2014 18:37
    • Marcado como Resposta Giovani Cr quinta-feira, 30 de janeiro de 2014 14:50
    quarta-feira, 22 de janeiro de 2014 18:32
  • Boa tarde,

    AlexAugustus, experimente mais ou menos dessa forma:

    with CTE_Hierarquica as
    (
        SELECT 
            s.Job, 
            s.Antecessor,
            cast(s.Job as varchar(500)) as JobCompleto
        FROM CTRL_M2 s
        WHERE 
            s.Antecessor = '-'
    
        UNION ALL
    
        SELECT 
            s.Job, 
            s.Antecessor,
            cast(x.JobCompleto + '.' + s.Job as varchar(500))
        FROM CTE_Hierarquica as x
        inner join CTRL_M2 s 
            on s.Antecessor = x.Job
    )
    
    select
        Job, 
        Antecessor,
        JobCompleto
    from CTE_Hierarquica 
    order by 
        JobCompleto 

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Giovani Cr quinta-feira, 30 de janeiro de 2014 14:50
    quarta-feira, 22 de janeiro de 2014 18:47

Todas as Respostas

  • Deleted
    • Marcado como Resposta AlexAugustus quarta-feira, 22 de janeiro de 2014 18:37
    • Não Marcado como Resposta AlexAugustus quarta-feira, 22 de janeiro de 2014 18:37
    • Marcado como Resposta Giovani Cr quinta-feira, 30 de janeiro de 2014 14:50
    quarta-feira, 22 de janeiro de 2014 18:32
  • Boa tarde,

    AlexAugustus, experimente mais ou menos dessa forma:

    with CTE_Hierarquica as
    (
        SELECT 
            s.Job, 
            s.Antecessor,
            cast(s.Job as varchar(500)) as JobCompleto
        FROM CTRL_M2 s
        WHERE 
            s.Antecessor = '-'
    
        UNION ALL
    
        SELECT 
            s.Job, 
            s.Antecessor,
            cast(x.JobCompleto + '.' + s.Job as varchar(500))
        FROM CTE_Hierarquica as x
        inner join CTRL_M2 s 
            on s.Antecessor = x.Job
    )
    
    select
        Job, 
        Antecessor,
        JobCompleto
    from CTE_Hierarquica 
    order by 
        JobCompleto 

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Giovani Cr quinta-feira, 30 de janeiro de 2014 14:50
    quarta-feira, 22 de janeiro de 2014 18:47