Fórum Dúvida com Left Join: Interno + externo / Inner Join: Cálculo interno #430989
13/12/2012
0
Olá,
estou com dois join's que não estou conseguindo entender, alguém poderia me explicá-los? Segue:
left join (b_produto_grupo left join b_produto_grupo pgm on b_produto_grupo.i_cod_b_produto_grupo_r = pgm.i_cod_b_produto_grupo)
on m_produto.i_cod_b_produto_grupo = b_produto_grupo.i_cod_b_produto_grupo
inner join (select
max(dt_base) as dt_base, i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa
from
m_historico_estoque
where
dt_base <= '2012-11-30'
and f_preco_custo > 0
group by
i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa
) de on (de.i_cod_m_saldo_estoque = m_saldo_estoque.i_cod_m_saldo_estoque and
de.i_cod_m_pessoa_empresa = m_saldo_estoque.i_cod_m_pessoa_empresa)
estou com dois join's que não estou conseguindo entender, alguém poderia me explicá-los? Segue:
left join (b_produto_grupo left join b_produto_grupo pgm on b_produto_grupo.i_cod_b_produto_grupo_r = pgm.i_cod_b_produto_grupo)
on m_produto.i_cod_b_produto_grupo = b_produto_grupo.i_cod_b_produto_grupo
inner join (select
max(dt_base) as dt_base, i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa
from
m_historico_estoque
where
dt_base <= '2012-11-30'
and f_preco_custo > 0
group by
i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa
) de on (de.i_cod_m_saldo_estoque = m_saldo_estoque.i_cod_m_saldo_estoque and
de.i_cod_m_pessoa_empresa = m_saldo_estoque.i_cod_m_pessoa_empresa)
Luiz Eduardo
Curtir tópico
+ 0
Responder
Posts
13/12/2012
Claudia Nogueira
Nesse primeiro dá a entender que na mesma tabela está salvando grupos e sub-grupos, sendo que os grupos ficam na tabela de produto e os sub-grupos na própria tabela de grupo.
Eu não faria assim, eu faria:
Nesse segundo parece que precisa ter esses 3 campos no SELECT dt_base, i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa, e em vez de colocar um SELECT pra cada campo na própria sentença em cima, ele preferiu fazer dessa forma que é mais rápido:
Depois em cima só precisa fazer isso: de.dt_base, de.i_cod_m_saldo_estoque, de.i_cod_m_pessoa_empresa.
Sempre que for fazer um sentença, coloque as condições entre parenteses, além de ficar mais organizado, fica mais rápida a consulta.
Não sou muito boa de explicar. :)
Eu não faria assim, eu faria:
LEFT JOIN b_produto_grupo bpg ON (m_produto.i_cod_b_produto_grupo = bpg.i_cod_b_produto_grupo) LEFT JOIN b_produto_grupo pgm ON (bpg.i_cod_b_produto_grupo_r = pgm.i_cod_b_produto_grupo)
Nesse segundo parece que precisa ter esses 3 campos no SELECT dt_base, i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa, e em vez de colocar um SELECT pra cada campo na própria sentença em cima, ele preferiu fazer dessa forma que é mais rápido:
INNER JOIN (SELECT MAX(dt_base) AS dt_base, i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa FROM m_historico_estoque WHERE (dt_base <= '2012-11-30') AND (f_preco_custo > 0) GROUP BY i_cod_m_saldo_estoque, i_cod_m_pessoa_empresa) de ON ((de.i_cod_m_saldo_estoque = m_saldo_estoque.i_cod_m_saldo_estoque) AND (de.i_cod_m_pessoa_empresa = m_saldo_estoque.i_cod_m_pessoa_empresa))
Depois em cima só precisa fazer isso: de.dt_base, de.i_cod_m_saldo_estoque, de.i_cod_m_pessoa_empresa.
Sempre que for fazer um sentença, coloque as condições entre parenteses, além de ficar mais organizado, fica mais rápida a consulta.
Não sou muito boa de explicar. :)
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)