1
resposta

[Dúvida] Como fazer a solução sem o UNION?

Olá. Tudo bem?

Fiz um teste com o UNION, no entanto teria uma solução mais compacta?

SELECT 
    JSON_EXTRACT(JSONVALUE, "$.Nome_Departamento") AS Nome_Departamento,
    JSON_EXTRACT(JSONVALUE, "$.Projeto[0].Nome_Projeto") AS Nome_Projeto,
    t2.CPF_FUNCIONARIO,
    t2.Horas
FROM tb_object_departamento_trabalha_em
CROSS JOIN JSON_TABLE(
    JSON_EXTRACT(JSONVALUE, "$.Projeto[0].Horas_Trabalhadas"),
    "$[*]"
    COLUMNS (
        CPF_FUNCIONARIO VARCHAR(11) PATH "$.Cpf_Funcionario",
        Horas INT PATH "$.Horas"
    )
) t2

UNION

SELECT 
    JSON_EXTRACT(JSONVALUE, "$.Nome_Departamento") AS Nome_Departamento,
    JSON_EXTRACT(JSONVALUE, "$.Projeto[1].Nome_Projeto") AS Nome_Projeto,
    t2.CPF_FUNCIONARIO,
    t2.Horas
FROM tb_object_departamento_trabalha_em
CROSS JOIN JSON_TABLE(
    JSON_EXTRACT(JSONVALUE, "$.Projeto[1].Horas_Trabalhadas"),
    "$[*]"
    COLUMNS (
        CPF_FUNCIONARIO VARCHAR(11) PATH "$.Cpf_Funcionario",
        Horas INT PATH "$.Horas"
    )
) t2
1 resposta

E aí Roberto!

Então, dá uma olhada nessa abordagem com subconsulta. Ela pode deixar as coisas mais enxutas:

SELECT 
    JSON_EXTRACT(JSONVALUE, "$.Nome_Departamento") AS Nome_Departamento,
    JSON_EXTRACT(JSONVALUE, "$.Projeto[0].Nome_Projeto") AS Nome_Projeto,
    t2.CPF_FUNCIONARIO,
    t2.Horas
FROM 
    tb_object_departamento_trabalha_em,
    JSON_TABLE(
        JSON_EXTRACT(JSONVALUE, "$.Projeto[0].Horas_Trabalhadas"),
        "$[*]"
        COLUMNS (
            CPF_FUNCIONARIO VARCHAR(11) PATH "$.Cpf_Funcionario",
            Horas INT PATH "$.Horas"
        )
    ) t2

UNION

SELECT 
    JSON_EXTRACT(JSONVALUE, "$.Nome_Departamento") AS Nome_Departamento,
    JSON_EXTRACT(JSONVALUE, "$.Projeto[1].Nome_Projeto") AS Nome_Projeto,
    t2.CPF_FUNCIONARIO,
    t2.Horas
FROM 
    tb_object_departamento_trabalha_em,
    JSON_TABLE(
        JSON_EXTRACT(JSONVALUE, "$.Projeto[1].Horas_Trabalhadas"),
        "$[*]"
        COLUMNS (
            CPF_FUNCIONARIO VARCHAR(11) PATH "$.Cpf_Funcionario",
            Horas INT PATH "$.Horas"
        )
    ) t2;

Essa versão agrupa as duas partes usando a tabela tb_object_departamento_trabalha_em uma vez só, e as subconsultas cuidam do restante. Isso pode deixar o código mais compacto e fácil de entender. Espero que ajude!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software