Inner Join, Left Join e Right Join

Loading

Inner Join, Left Join e Right Join
Inner Join, Left Join e Right Join

A clausula JOIN combina registros de duas ou mais tabelas em um banco de dados. O JOIN realiza a combinação de campos de duas tabelas, usando valores comuns a cada tabela. Existem quatro tipo de JOIN: INNER JOIN, OUTER JOIN, LEFT JOIN e RIGHT.

Inner Join

Um INNER JOIN é a operação de associação mais comum e pode ser considerado como o padrão JOIN. INNER JOIN cria uma nova tabela temporária de resultados através da combinação de valores de colunas de duas tabelas (A e B) com base nos PARAMETROS. A consulta compara cada linha de A com cada linha de B para encontrar todos os pares de linhas que satisfazem o JOIN.

VEJA TAMBÉM:   Conjuntos de Relacionamentos

Vamos a um exemplo de INNER JOIN.

Digamos que você tenha duas tabelas, tblPedido (IDPedido (PK), IDCliente (FK), Produto) e tblCliente (IDCliente(PK), NomeCliente).

Se fizer um SELECT no tblPedido, em IDCliente ira retornar apenas o código do Cliente. Digamos que você queira que na consulta, alem de retornar os dados de tblPedido, também retorne todos os dados da tabela tblCliente. Para isso você terá que usar o INNER JOIN. Usando INNER JOIN os retornará os seguinte campo:

(IDPedido (PK), IDCliente (FK), Produto, IDCliente(PK), NomeCliente.

Comando

SELECT * FROM tblPedido
INNER JOIN tblCliente
ON tblCliente.IDCliente = tblCliente.IDCliente

OBS: No INNER JOIN, caso alguma tabela algum campo em branco, o resultado será omitido.

VEJA TAMBÉM:   Como gerar JSON tabela SQL em poucas linhas

LEFT JOIN

Similar ao INNER JOIN, porém ele trás todos os campos das tabelas A e B, mesmo que a tabela B tenha algum campo vazio.

RIGHT JOIN

Similar ao INNER JOIN, porém ele trás todos os campos das tabelas A e B, mesmo que a tabela A tenha algum campo vazio.

 Veja abaixo mais um vídeo que fala mais sobre Inner Join, Left Join e Right Join

6 comentários em “Inner Join, Left Join e Right Join”

  1. Alexandre Pegoraro de Souza

    Boa tarde Fabio, estou com um probleminha, tenho três tabelas, A com num de Danfes, B com itens da Danfe e C com Natureza Financeira, já tentei Left, Right e FULL OUTER JOIN, mas apenas me retorna a Danfe com seus respectivos itens que contém a Natureza Financeira. O que desejamos nesta consulta é que retorne as Danfes com os itens e a Natureza Financeira quando tiver, as Danfes que não tiverem a Natureza Financeira trazer a Danfe os Itens e no lugar da Natureza ficar em Branco ou Null.
    Chaves: Tabela A (Cabeçalho Danfe) – f1_doc,f1_serie, f1_fornece, f1_loja
    Tabela B(Itens Danfe) – d1_doc,d1_serie, d1_fornece, d1_loja
    Até aqui beleza, o bicho começa a pegar na próxima.
    Tabela C ( Natureza Financeira ) E2_NUM = F1_DOC , E2_PREFIXO = F1_SERIE, E2_FORNECE = F1_FORNECE,E2_LOJA = F1_LOJA.

    Obs: Nem todas as Danfes que foram gravadas nas Tabelas A e B foram gravadas na Tabela C.

    Desde já agradeço.

    Alexandre

      1. Alexandre Pegoraro de Souza

        Boa tarde, Fabio, tentei sua sugestão mas não tinha dado certo, segue abaixo a estrutura, desde já agradeço pela atenção.
        SELECT DISTINCT
        D1_TIPO AS TIPO,
        F1_DOC AS DANFE,
        F1_EMISSAO AS ‘DATA EMISSAO’,
        F1_DTDIGIT AS ‘DT LANC SISTEMA’,
        F1_FORNECE AS FORNECEDOR,
        F1_LOJA AS LOJA,
        A2_NOME AS RAZAO,
        B1_GRUPO AS ‘GRUPO PROD’,
        BM_DESC AS ‘DESC GRUPO’,
        D1_COD AS ‘COD PRODUTO’,
        B1_DESC AS DESCRICAO,
        E2_NATUREZ AS NATUREZA,
        ED_DESCRIC AS ‘DESC NATUR’,
        DE_CC AS ‘C CUSTO’,
        CTT_DESC01 AS ‘DESC C CUSTO’,
        DE_PERC AS PERC,
        DE_X_VALOR AS ‘VALOR RATEIO’,
        F1_VALBRUT AS ‘VALOR DANFE’

        FROM SD1010 INNER JOIN SF1010 ON D1_DOC = F1_DOC
        AND D1_SERIE = F1_SERIE
        AND D1_FORNECE = F1_FORNECE
        AND D1_LOJA = F1_LOJA

        INNER JOIN SB1010 ON B1_FILIAL = ‘ ‘
        AND B1_COD = D1_COD

        INNER JOIN SA2010 ON A2_COD = F1_FORNECE
        AND A2_LOJA = F1_LOJA

        LEFT JOIN SE2010 ON E2_NUM = F1_DOC
        AND E2_PREFIXO = F1_SERIE
        AND E2_FORNECE = F1_FORNECE
        AND E2_LOJA = F1_LOJA
        AND (SE2010.D_E_L_E_T_ IS NULL OR SE2010.D_E_L_E_T_ ‘*’)

        LEFT JOIN SED010 ON ED_CODIGO = E2_NATUREZ

        LEFT JOIN SDE010 ON DE_DOC = F1_DOC
        AND DE_SERIE = F1_SERIE
        AND DE_FORNECE = F1_FORNECE
        AND DE_LOJA = F1_LOJA
        AND DE_ITEMNF = D1_ITEM

        LEFT JOIN CTT010 ON CTT_CUSTO = DE_CC

        LEFT JOIN SBM010 ON BM_GRUPO = B1_GRUPO

        WHERE D1_DTDIGIT >= ‘20131201’–RIGHT(Convert(varchar,:DataDe),4)+SUBSTRING(Convert(varchar,:DataDe),3,2)+LEFT(Convert(varchar,:DataDe),2)
        AND D1_DTDIGIT <= '20131217'–RIGHT(Convert(varchar,:DataDe),4)+SUBSTRING(Convert(varchar,:DataDe),3,2)+LEFT(Convert(varchar,:DataDe),2)
        AND D1_TIPO = 'N'
        AND SD1010.D_E_L_E_T_ ‘*’
        AND SB1010.D_E_L_E_T_ ‘*’
        AND SF1010.D_E_L_E_T_ ‘*’
        AND SA2010.D_E_L_E_T_ ‘*’
        AND SE2010.D_E_L_E_T_ ‘*’
        AND SED010.D_E_L_E_T_ ‘*’
        AND SDE010.D_E_L_E_T_ ‘*’
        AND CTT010.D_E_L_E_T_ ‘*’
        AND SBM010.D_E_L_E_T_ ‘*’

        GROUP BY D1_TIPO,F1_DOC,F1_FORNECE,F1_LOJA,A2_NOME, D1_TIPO,D1_COD, B1_DESC, F1_VALBRUT,F1_EMISSAO,F1_DTDIGIT , E2_NATUREZ
        ,DE_CC, CTT_DESC01,DE_PERC,DE_CUSTO1,ED_DESCRIC, DE_X_VALOR, F1_VALMERC
        ,B1_GRUPO, BM_DESC
        ORDER BY F1_DOC

        ***********
        O relatório é para sair como abaixo ( exportei para . csv )vai ter Danfe que não vai ter na Tabela SF1010 que não vai ter na SF2010 este é para ficar em branco, as que tiverem trazer a natureza

        TIPO;DANFE;DATA EMISSAO;DT LANC SISTEMA;FORNECEDOR;LOJA;RAZAO;GRUPO PROD;DESC GRUPO;COD PRODUTO;DESCRICAO;NATUREZA;DESC NATUR;C CUSTO;DESC C CUSTO;PERC;VALOR RATEIO;VALOR DANFE
        N;23;20131205;20131216;1892;1;GALLETTINHO COMERCIO E CONSIGNACAO DE CA;31;CAMINHOES E BAU ;300074;LAVAGEM VEICULO (INDEDUTIVEL) ;10.101.06 ;SERVICO DE MANUTENCAO DE FROTA;1108;FIY3757 ;100;30;30
        N;38;20131209;20131209;92;1;M.P. DOS SANTOS REPRESENTACOES COM.ME ;31;CAMINHOES E BAU ;300002;COMISSAO ;10.103.09 ;COMISSOES DE REPRESENTANTES ;;;100;5104,38;5104,38
        N;39;20131207;20131207;1739;1;REFRIGERACAO DE TRANSPORTE DE MARILIA LT;31;CAMINHOES E BAU ;300000;SERVICOS DE MANUTENCAO CAMINHOES ;;;31101;CLJ0547 ;50;120;240
        N;39;20131207;20131207;1739;1;REFRIGERACAO DE TRANSPORTE DE MARILIA LT;31;CAMINHOES E BAU ;300000;SERVICOS DE MANUTENCAO CAMINHOES ;;;31102;CLJ0635 ;50;120;240
        N;45;20131207;20131209;1739;1;REFRIGERACAO DE TRANSPORTE DE MARILIA LT;211;MECANICA ;200003;PECAS DE CAMINHAO ;10.100.08 ;COMPRA MAN.FROTA REFRIGERACAO ;31102;CLJ0635 ;100;229,1;374,1
        N;45;20131207;20131209;1739;1;REFRIGERACAO DE TRANSPORTE DE MARILIA LT;211;MECANICA ;200080;OLEO ;10.100.08 ;COMPRA MAN.FROTA REFRIGERACAO ;31102;CLJ0635 ;100;10;374,1
        N;45;20131207;20131209;1739;1;REFRIGERACAO DE TRANSPORTE DE MARILIA LT;214;COMBUSTIVEIS E LUBRIFICANTES ;200127;GAS 404 REFRIGERACAO ;10.100.08 ;COMPRA MAN.FROTA REFRIGERACAO ;31102;CLJ0635 ;100;90;374,1
        N;45;20131207;20131209;1739;1;REFRIGERACAO DE TRANSPORTE DE MARILIA LT;214;COMBUSTIVEIS E LUBRIFICANTES ;200221;NITROGENIO ;10.100.08 ;COMPRA MAN.FROTA REFRIGERACAO ;31102;CLJ0635 ;100;45;374,1

  2. Eu preciso resolver isso
    tenho como mim da uma ajuda.
    abraços

    5. Criar um mecanismo de busca que exiba os dados dos atributos código do
    produto, nome do produto, preço unitário do produto, quantidade em estoque e
    da entidade produtos e linha de produto da entidade linhas de produtos.
    Os dados recuperados deverão ser exibidos agrupados por linha de produto e o
    valor monetário em estoque para cada produto;

    6. Criar um mecanismo de busca que recupere os atributos nome e sobrenome, o
    local de trabalho e os clientes atendidos pelos vendedores da organização.
    Os dados recuperados deverão ser agrupados e ordenados em ordem ascendente
    por nome do vendedor;

    eu tenho todas essas tabelas já feita, só falta o código que estou tentando criar .

Deixe um comentário

Rolar para cima