Ir para o conteúdo

Como Criar e Usar Junções e Uniões SQL

Ao criar objetos de negócios na camada de lógica de negócios, muitas vezes é necessário comparar duas tabelas separadas para exibir dados de ambas. Com o Vinyl, você pode configurar um tipo Join para combinar colunas de uma ou mais tabelas, ou Business Objects, para criar um novo Business Object. Este artigo irá guiá-lo através dos quatro tipos de SQL Joins suportados no Vinyl - Inner, Left Outer, Cross e Right Outer - e dar exemplos de como criá-los e usá-los no Vinyl. Além disso, também daremos uma olhada em outro tipo de relacionamento chamado Union que está disponível para configuração em Joins in Vinyl.

  • Inner - O tipo Inner Join retorna linhas que existem em cada tabela
  • Cross - O Cross Join produz um produto cartesiano
  • Left Outer - Uma junção externa esquerda retorna todas as linhas da tabela esquerda especificada, independentemente de uma correspondência na tabela direita
  • Right Outer - Um Right Outer retorna todas as linhas da tabela direita especificada, independentemente de uma correspondência na tabela esquerda
  • Union - Combina o conjunto de resultados de duas ou mais instruções SELECT

Junção Interna

O Que é uma Junção Interna?

Junções internas são as junções usadas com mais frequência. Quando fornecidas duas tabelas, o conjunto de resultados de uma Junção Interna contém apenas as linhas entre as duas tabelas que são iguais, com base nas colunas da Junção.

Diagrama interno

Exemplo

Digamos que queremos um Business Object de clientes que fizeram um pedido e os detalhes do pedido feito. Este seria um ótimo caso de uso para Inner Join, porque um Inner Join pode retornar registros na interseção de duas tabelas. Nosso conjunto resultante deve incluir todos CustomerID que tem um OrderID. Abaixo estão as duas tabelas Customer e Order ao qual iremos aderir.

Tabela de clientes

Uma tabela de pedidos

Antes de criar seu Inner Join, você precisa criar um Business Object. O nosso se chama Customer (with Order). Traga as duas tabelas para o painel Tabelas. Implemente a junção interna entre Customer e Order. A coluna Unir aqui é CustomerID que é a única coluna entre as duas que é igual.

join1.png

Innercolumnstab

Innerjoinstab

O conjunto de resultados deve ser dos Clientes que fizeram Pedidos. Nesse caso, nossos dados resultaram em uma linha:

Resultados internos

Junção Cruzada

O Que é uma Junção Cruzada?

Uma Cross Join produz um conjunto de resultados que é o número de linhas x na primeira tabela multiplicado pelo número de linhas y na segunda tabela. O conjunto de resultados será x * y linhas.

Ao tentar decidir o que faz sentido com uma junção cruzada, é útil dizer que o conjunto resultante terá colunas da tabela 1 para cada coluna da tabela 2.

Diagrama cruzado

Exemplo

Temos duas mesas, Category e Supplier. Sabemos que cada Supplier gostaria de cada Category, então precisamos criar um Business Object que combine essas duas tabelas. Gostaríamos de um conjunto resultante que tivesse uma Category para cada Supplier. Este é um exemplo perfeito de quando usar um Cross Join.

Abaixo estão exemplos de registros para as tabelas Category e Supplier:

Registros de categoria

Um registro de fornecedor

Para fazer a junção cruzada dessas duas tabelas, precisamos criar um novo Business Object. Chamamos o nosso Supplier (and Categories). Traga as duas tabelas que gostaríamos de fazer Cross Join no painel Tabelas. No painel Joins, indique que você gostaria de uma Cross Join entre as duas tabelas.

join2.png

A Cruzadas

Uma junção cruzada

Nota

Não precisamos indicar colunas de Join porque, com o Cross Join, as duas tabelas não precisam ter colunas em comum para o Join. Ainda podemos conseguir um Category para cada Supplier.

Após implementar este Join, veremos resultados como este. Observe que há um Category para cada Supplier:

Resultados cruzados

Junção Externa Esquerda

O Que é uma Junção Externa Esquerda?

Uma junção externa esquerda busca todas as linhas correspondentes de duas tabelas (a interna entre as duas) mais as linhas que não correspondem a nenhuma linha na segunda tabela. Isso é útil quando você deseja todos os resultados comuns entre duas tabelas, mas também deseja os valores nulos na tabela esquerda.

Um diagrama externo esquerdo

Exemplo

Você pode querer uma lista de todos os clientes, tenham eles feito um pedido ou não. Neste caso, uma junção externa esquerda seria perfeita. Este exemplo é semelhante ao exemplo anterior de Inner Join, exceto que neste caso também queremos ver resultados onde há um CustomerID listado sem um OrderID.

Abaixo estão as tabelas que estamos usando: Customer e Order. São as mesmas tabelas que usamos no exemplo de Inner Join.

Tabela de clientes

Uma tabela de pedidos

Esta declaração de Business Object é muito semelhante ao objeto de negócios do exemplo Inner Join. A única diferença é o nome e a declaração dessa junção como Left Outer em vez de Inner Join.

join3.png

Innercolumnstab

A Lo se junta

Os resultados nos dão os mesmos resultados que o Inner Join nos deu, mais as linhas no Customer tabela que não corresponde a nenhuma linha na Order mesa.

Existem 92 resultados desta vez.

Resultados baixos

Exterior Direito

O Que é uma Junção Externa Correta?

A terceira junção é Right Outer Join, que é exatamente o oposto de Left Outer. Usar um ou outro geralmente não importa porque você sempre pode alternar uma tabela da esquerda para a direita da junção e obtém o mesmo efeito. Os resultados irão variar dependendo da junção escolhida e da ordem das tabelas adicionadas ao painel Junções.

Um Diagrama Ro

Exemplo

Como exemplo de querer mudar de uma junção externa esquerda para uma junção externa direita, você pode querer visualizar todos os seus clientes com ou sem pedidos, bem como todos os detalhes do pedido com ou sem pedidos ou produtos. A declaração abaixo é uma maneira de configurar essa lógica.

join4.png

Colunas A Ro

A Ro se junta

Quando executamos os resultados ou visualizamos os resultados da grade rápida, vemos os seguintes registros retornados:

Resultados de A Ro

União

O Que é uma União?

No Vinyl, Union Joins produz uma combinação de duas instruções select que têm como alvo a mesma coluna. Uma Union Join combina os resultados de duas colunas diferentes (que têm o mesmo nome) de duas tabelas diferentes em uma coluna unificada. Embora a maioria das junções utilize uma coluna Join, a Union Join não o faz. Isso ocorre porque outros Joins exigem contexto compartilhado entre as duas tabelas para funcionar, mas um Union Join requer apenas colunas compartilhadas.

Exemplo 1

Por exemplo, uma junção interna entre o Product e Supplier tabelas mostrariam cada produto junto com seu fornecedor, enquanto uma união sindical entre o Product e Supplier tabelas mostrariam uma lista de todos os diferentes SupplierID Campos. Isso ocorre porque Union Join mostra essencialmente todos os resultados da mesma coluna em duas tabelas diferentes, e essas duas tabelas compartilham apenas o SupplierID. Lembre-se de que com Joins, compartilhar contexto e ter a mesma coluna são dois critérios diferentes.

Abaixo estão as duas tabelas Fornecedor e Produto.

Resultados de um fornecedor

Resultados de um produto

Agora você pode criar seu Business Object que utilizará o Union Join. Chamamos o nosso Supplier (Union with Product). Traga as tabelas que você usará para o painel Tabelas. Declare uma união entre as duas tabelas no painel Joins. Novamente, esta junção não requer coluna de junção. O painel Colunas só nos permite adicionar SupplierID como uma coluna porque é a única coluna que as duas tabelas têm em comum.

join5.png

A Colunas de União

Um sindicato se junta

O conjunto de resultados contém todos os SupplierID's, incluindo registros duplicados se o SupplierID aparece em ambas as tabelas.

Resultados da União

Exemplo 2

Outro caso de uso de um sindicato é se um cliente solicitar que você encontre todos os respondentes, mas os usuários podem responder de várias maneiras. Digamos que um usuário possa responder por email, que é inserido em uma tabela chamada EmailRespondants, mas eles também podem responder por meio de chamada telefônica usando o PhoneRespondant mesa. Você poderia unir as tabelas para encontrar as colunas que elas têm em comum, que poderiam ser RespondantID e RespondType para receber uma lista de todas as pessoas que responderam e como elas responderam. Desta forma você também pode ver o mesmo RespondantID várias vezes, mas ser capaz de ver como eles responderam a cada vez.