1
resposta

Gostaria de saber se dessa maneira que escrevi está correto ou não.

select T2.Nome_Departamento, T2.Nome_Projeto, T2.Cpf_Funcionario, T2.Horas
from tb_object_departamento_projeto_trabalha_em
cross join
json_table(json_extract(jsonvalue, "$.Nome_Departamento", "$.Projeto[0].Nome_Projeto", "$.Projeto[0].Horas_Trabalhadas[0].Cpf_Funcionario", "$.Projeto[0].Horas_Trabalhadas[0].Horas"), "S[*]"
columns (Nome_Departamento varchar(20) path "$.Nome_Departamento",
Nome_Projeto varchar(20) path "$.Nome_Projeto",
Cpf_Funcionario varchar(11) path "$.Cpf_Funcionario",
Horas time path "$.Horas")) T2;
1 resposta

Oi, Fernando, tudo bem?

Desde já, peço desculpas pela demora em te responder.

Existem algumas mudanças que precisamos fazer para o SELECT ficar certinho, vmos analisá-las mais de perto?

  1. Para realizar a consulta, precisamos indicar, já no início, as colunas Nome_Departamento, Nome_Projeto CPF_FUNCIONARIO e Horas. Como Nome_Departamento e Nome_Projeto são colunas que não serão utilizadas para a junção futura, seus conteúdos já serão extraídos diretamente no SELECT, o qual ficará assim:

     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_projeto_trabalha_em

    Acima, podemos perceber que já foi realizada a extração das informações com a função JSON_EXTRACT! Além disso, para um melhor entendimento acerca das duas primeiras colunas, adicionamos um apelido a cada uma dela por meio da cláusula AS.

  2. Depois disso, já podemos iniciar o CROSS JOIN! As únicas informações necessárias para alcançar o objetivo da atividade são Horas_Trabalhadas, Cpf_Funcionario e Horas. Ao fim, o código ficará desta forma:

     CROSS JOIN JSON_TABLE(
       JSON_EXTRACT(jsonvalue, "$.Projeto[0].Horas_Trabalhadas"),
       "$[*]"
       COLUMNS (
         CPF_FUNCIONARIO VARCHAR(11) PATH "$.Cpf_Funcionario",
         Horas TIME PATH "$.Horas"
       )
     ) t2;

    Para utilizar as horas trabalhadas no CROSS JOIN, obtemos os valores a partir da chave $.Projeto[0].Horas_Trabalhadas. Desse modo, poderemos relacionar tais dados com Cpf_Funcionario e Horas.

    Além disso, vale ressaltar que houve uma mudança em "$[*]": para obter todas as informações necessárias a partir das colunas definidas, usamos o símbolo de cifrão com abertura de colchetes, asterisco e fechamento de colchetes.

Depois dessas mudanças, Fernando, o SELECT ficará assim:

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_projeto_trabalha_em
CROSS JOIN JSON_TABLE(
  JSON_EXTRACT(jsonvalue, "$.Projeto[0].Horas_Trabalhadas"),
  "$[*]"
  COLUMNS (
    CPF_FUNCIONARIO VARCHAR(11) PATH "$.Cpf_Funcionario",
    Horas TIME PATH "$.Horas"
  )
) t2;

Continue sempre dedicado nos estudos e evoluindo! Em caso de dúvidas sobre o passo a passo que construímos ou sobre outros assuntos, conte comigo.

Abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!