Compartilhar via


Operação INNER JOIN (Microsoft Access SQL)

Aplica-se ao: Access 2013, Office 2013

Combina registros de duas tabelas sempre que houver valores correspondentes em um campo comum.

Sintaxe

FROM table1 INNER JOIN table2 ON table1. tabela depoprfield12. campo2

A operação INNER JOIN contém as seguintes partes:

Parte

Descrição

tabela1, tabela2

Os nomes das tabelas das quais os registros são combinados.

field1, field2

Os nomes dos campos unidos. Caso não sejam numéricos, os campos deverão ser do mesmo tipo e conter o mesmo tipo de dados, mas não é necessário que tenham o mesmo nome.

oprcomp

Qualquer operador de comparação relacional: "=," "<," ">," "<=," ">=," ou "<>."

Comentários

É possível usar uma operação INNER JOIN em qualquer cláusula FROM. Esse é o tipo de junção mais comum. As junções internas combinam registros de duas tabelas sempre que houver correspondência de valores em campos comuns nas duas tabelas.

É possível usar a INNER JOIN nas tabelas Departamentos e Funcionários para selecionar todos os funcionários de um departamento. Em contrapartida, para selecionar todos os departamentos (mesmo se não houver funcionários atribuídos a eles) todos os funcionários (mesmo que alguns não estejam atribuídos ao departamento), é possível usar uma operação LEFT JOIN ou RIGHT JOIN para criar uma junção externa.

Se você tentar juntar campos contendo dados de objeto OLE ou Memorando, ocorrerá um erro.

É possível juntar pares de campos numéricos ou de tipos semelhantes. Por exemplo, você poderá juntar os campos Numeração Automática e Longo, pois eles são de tipos semelhantes. No entanto, não é possível juntar campos de tipo simples com duplos.

O seguinte exemplo mostra como você poderá unir as tabelas Categorias e Produtos no campo CategoryID:

SELECT CategoryName, ProductName 
FROM Categories INNER JOIN Products 
ON Categories.CategoryID = Products.CategoryID;

No exemplo anterior, a ID de Categoria é o campo de junção, mas não é incluída na saída de consulta porque não está incluída na instrução SELECT. Para incluir o campo de junção, insira o nome do campo na instrução SELECT — neste caso, Categories.CategoryID.

Você também pode vincular várias cláusulas ON em uma instrução de JOIN, usando a seguinte sintaxe:

SELECIONAR campos DA tabela1 INNER JOIN tabela2 ON table1. tabeladepoprfield12. campo1 E tabela1. tabelade compoprfield2.campo2 OU tabela1. tabela de compoprfield32. campo3;

Também é possível aninhar instruções JOIN usando a seguinte sintaxe:

SELECT fields FROM table1 INNER JOIN (table2 INNER JOIN [( ]table3 [INNER JOIN [( ]tablex [INNER JOIN ...)] NA tabela3. tabela de compoprfield3.fieldx)] ON table2. tabeladepoprfield23. campo3) ON table1. tabeladepoprfield12. campo2;

Uma LEFT JOIN ou RIGHT JOIN pode estar aninhada em uma INNER JOIN, mas INNER JOIN não pode estar aninhada dentro de uma LEFT JOIN ou RIGHT JOIN.

Exemplo

Esse exemplo cria duas equijunções: uma entre as tabelas Pedidos e Detalhes do Pedido, e outra entre as tabelas Pedidos e Funcionários. Isso é necessário, pois a tabela Funcionários não inclui os dados de vendas e a tabela Detalhes do Pedido não inclui dados de funcionários. A consulta vai criar uma lista de funcionários e o total de suas vendas.

Este exemplo chama o procedimento EnumFields, que pode ser localizado no exemplo da instrução SELECT.

    Sub InnerJoinX() 
     
        Dim dbs As Database, rst As Recordset 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
         
        ' Create a join between the Order Details and  
        ' Orders tables and another between the Orders and  
        ' Employees tables. Get a list of employees and  
        ' their total sales. 
        Set rst = dbs.OpenRecordset("SELECT DISTINCTROW " _ 
            & "Sum(UnitPrice * Quantity) AS Sales, " _ 
            & "(FirstName & Chr(32) & LastName) AS Name " _ 
            & "FROM Employees INNER JOIN(Orders " _ 
            & "INNER JOIN [Order Details] " _ 
            & "ON [Order Details].OrderID = " _ 
            & "Orders.OrderID ) " _ 
            & "ON Orders.EmployeeID = " _ 
            & "Employees.EmployeeID " _ 
            & "GROUP BY (FirstName & Chr(32) & LastName);") 
         
        ' Populate the Recordset. 
        rst.MoveLast 
         
        ' Call EnumFields to print the contents of the  
        ' Recordset. Pass the Recordset object and desired 
        ' field width. 
        EnumFields rst, 20 
     
        dbs.Close 
     
    End Sub