Cláusula SQL Server JOIN
- 12-09-2022
- Toanngo92
- 0 Comments
Mục lục
Apresentando JOIN no SQL Server
JOIN é usado para recuperar dados de duas ou mais tabelas com base no relacionamento lógico entre as tabelas. Uma junção ( JOIN ) normalmente especifica um relacionamento de chave estrangeira entre tabelas. Ele determina como duas tabelas estão relacionadas em uma consulta por:
- Especifique a coluna de cada tabela a ser usada para a junção ( JOIN ). Uma junção típica ( JOIN ) especifica uma chave estrangeira de uma tabela e sua chave relacionada em outra.
- Especifique um operador lógico como =, <> a ser usado para comparar valores de colunas.
O JOIN pode ser especificado na cláusula FROM ou WHERE .
Sintaxe:
SELECT <ColumnName1>, <ColumnName2>, ... <ColumnNameN> FROM Table_Name1 AS alias_1 JOIN Table_Name2 AS alias_2 ON alias_1.<RelatedColumn> = alias_2.<RelatedColumn>
Suponha que você deseja obter uma lista de nomes de funcionários, sobrenome e cargo das tabelas HumanResources.Employee e Person.Person. Para obter as informações de 2 tabelas, é necessário unir as 2 tabelas de acordo com a associação de chave estrangeira da coluna BusinessEntiyID. Por exemplo:
SELECT A.FirstName,A.LastName,B.JobTitle FROM Person.Person A JOIN HumanResources.Employee B ON A.BusinessEntityID = B.BusinessEntityID
Desenvolvendo ainda mais este problema, temos 3 tipos conceituais de JOINS:
- Junções internas
- Junções externas
- Auto-junções
Junção interna
Uma junção interna é formada quando os registros de duas tabelas são combinados somente se as linhas de ambas as tabelas corresponderem com base em uma coluna comum.
Diferença entre JOIN e INNER JOIN : JOIN retorna todas as linhas de tabelas onde o registro de chave de uma tabela é igual aos registros de chave de outra tabela . INNER JOIN seleciona todas as linhas de ambas as tabelas de junção, desde que haja uma correspondência entre as colunas
Sintaxe:
SELECT <ColumnName1>,<ColumnName2> ... <ColumnNameN> FROM Table_A AS Table_Alias_A INNER JOIN Table_B AS Table_Alias_B ON Table_Alias_A.<RelatedColumn> = Table_Alias_B.<RelatedColumn>
Por exemplo:
SELECT A.FirstName, A.LastName, B.JobTitle FROM Person.Person A INNER JOIN HumanResources.Employee B ON A.BusinessEntityID = b.BusinessEntityID
Junção Externa
As associações externas são instruções de junção que retornam todas as linhas de pelo menos uma das tabelas especificadas na cláusula FROM , desde que essas linhas atendam a qualquer uma das condições WHERE ou HAVING da instrução SELECT . Dois tipos de junção externa comumente usados são os seguintes:
- Junção Externa Esquerda
- Junção Externa Direita
Junção Externa Esquerda
A junção externa esquerda retorna todos os registros da tabela esquerda e apenas o registro correspondente à direita.
Sintaxe:
SELECT <ColumnList> FROM Table_A AS ALIAS_A LEFT OUTER JOIN Table_B AS ALIAS_B ON ALIAS_A.<RelatedColumn> = ALIAS_B.<RelatedColumn>
Digamos que você queira obter todos os IDs de clientes da tabela Sales.Customers e informações do pedido, como datas de envio., datas de vencimento, obtenha até clientes que não fizeram nenhum pedido, mas o número de registros é muito grande, portanto, limitaremos o pedido antes 2019, para isso, você realiza o LEFT OUTER JOIN da seguinte forma:
SELECT A.CustomerID, B.DueDate, B.ShipDAte FROM Sales.Customer A LEFT OUTER JOIN Sales.SalesOrderHeader B ON A.CustomerID = B.CustomerID AND YEAR(B.DueDate) < 2019
No código acima, a junção externa esquerda é uma estrutura entre as tabelas Sales.Customer e Sales.SalesOrderHeader . A tabela é unida com base na coluna de ID do cliente. Nesta situação, todos os registros da tabela da esquerda são Sales.Customer e somente os registros correspondentes da tabela da direita são Sales.SalesOrderHeader , se os dados da tabela da direita não corresponderem, a tabela da esquerda ainda é recuperada e a tabela a ser o direito dos dados retornará null.
Junção Externa Direita
A junção externa direita recupera todos os registros da tabela à direita da junção, independentemente de haver uma correspondência na primeira tabela.
SELECT <ColumnList> FROM Left_Table_Name AS Alias_A RIGHT OUTER JOIN Table_B as ALIAS_B ON Alias_A.<RelatedColumn> = Allias_B.<RelatedColumn>
Por exemplo, você deseja recuperar todos os nomes de produtos da tabela de produtos e todos os pedidos correspondentes da tabela SalesOrderDetail, embora possam existir registros de produtos que não correspondam aos dados da tabela SalesOrderDetail (produtos que ainda não foram vendidos). sempre) da seguinte forma:
SELECT P.Name,S.SalesOrderID FROM Sales.SalesOrderDetail S RIGHT OUTER JOIN Production.Product P ON P.ProductID = S.ProductID
Auto-inscrição
Uma junção de autojunção é usada para mostrar o relacionamento entre registros na mesma tabela. Uma tabela que é unida a si mesma é chamada Self-Join .
Por exemplo, talvez você queira usar a associação automática para recuperar detalhes do produto que tenham a mesma cor na tabela Production.Product
SELECT p1.ProductID, p1.Color, p1.Name, p2.Name FROM Production.Product p1 INNER JOIN Production.Product p2 ON p1.Color = p2.Color ORDER BY p1.ProductID
MERGE . declaração
A instrução MERGE permite manter uma tabela de destino sob certas condições de junção em uma tabela de origem usando uma única instrução.
Por exemplo, se você quiser:
- Compare o sobrenome e o nome do cliente de 2 tabelas de origem e destino
- Atualizar as informações do cliente na tabela de destino se o nome e o sobrenome corresponderem
- Adicione um novo registro na tabela de destino se o sobrenome e os nomes na tabela de origem não existirem na tabela de destino
- Excluir registros na tabela de destino se o sobrenome e o nome não corresponderem à tabela de origem
A instrução MERGE conclui as tarefas em uma única instrução. MERGE também permite exibir registros que foram inseridos, atualizados ou excluídos usando a cláusula OUTPUT.
Sintaxe:
MERGE target_table USING source_table ON match_condition WHEN MATCHED THEN UPDATE SET col1 = vale [,Col2 = val2] WHEN [TARGET] NOT MATCHED THEN INSERT (Col1[,Col2...]) VALUES(Val1[,Val2...]) WHEN NOT MATCH BY SOURCE THEN DELETE [OUTPUT $action, inserted.Col1,Deleted.Col1,....];
Explique:
- target_table: a tabela de destino onde os dados serão alterados aqui
- source_table: tabela de origem, contém registros que podem ser adicionados, atualizados e excluídos na tabela de destino
- match_conditions: a condição de junção (JOIN) e quaisquer operadores de comparação.
- MATCHED: retorna true se os registros target_table e source_table corresponderem à condição_de_correspondência.
- NOT MATCHED: retorna true se o registro da tabela_origem não existir na tabela_destino.
- SOURCE NOT MATCH: Retorna se o registro existe em target_table mas não em source_table.
- OUTPUT: cláusula opcional permite a visualização de registros que foram tema/excluídos/atualizados em target_Table.
A instrução MERGE termina com um ponto e vírgula (;).
Por exemplo:
use AdventureWorks2019 go SET IDENTITY_INSERT [Person].[AddressType] ON MERGE INTO [Person].[AddressType] AS Target USING (VALUES (1,'Billing') , (2,'Home'),(3,'Headquarters'),(4,'Primary'),(5,'Shipping'),(6,'Archival'),(7,'Contact'),(8,'Alternative')) AS Source ([AddressTypeID],[Name]) ON (Target.[AddressTypeID] = Source.[AddressTypeID]) WHEN MATCHED AND (Target.[Name] <> Source.[Name]) THEN UPDATE SET [Name] = Source.[NAME] WHEN NOT MATCHED BY TARGET THEN INSERT ([AddressTypeID],[Name]) VALUES(Source.[AddressTypeID],Source.[Name]) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action, Inserted.[AddressTypeID], Inserted.Name, Deleted.[AddressTypeID], Deleted.Name;
A tabela Person.AddressType é a tabela de destino, os dados de amostra são inseridos através do comando USING (VALUES (1,’Billing’) , (2,’Home’),(3,’Headquarters’),(4,’Primary’) ,(5,’Shipping’),(6,’Archival’),(7,’Contact’),(8,’Alternative’)) AS Source é a tabela de origem, a condição correspondente é a coluna AddressTypeID de ambas as tabelas . fonte e destino. Se a condição de correspondência for avaliada como falsa (NOT MATCHED). Novos registros serão adicionados à tabela de destino. Se as condições de correspondência retornarem true (MATCHED), o registro será atualizado para a tabela de destino com base nos dados da tabela de origem.
Se os registros na tabela de destino não corresponderem à tabela de origem (NOT MATCHED BY SOURCE), eles serão excluídos da tabela de destino. A função da última instrução é relatar as linhas que foram adicionadas/atualizadas/excluídas e exibir a saída.