Combinando tabelas com Join e Keep

A junção é uma operação que usa duas tabelas para combiná-las em uma. Os registros da tabela resultante são combinações dos registros das tabelas originais, de forma que, geralmente, os dois registros que contribuem para qualquer combinação na tabela resultante tenham um valor comum para um ou vários campos comuns, a assim chamada junção natural. No Qlik Sense, as junções podem ser feitas no script, produzindo tabelas lógicas.

É possível unir tabelas que já estão no script. Assim, a lógica do Qlik Sense não verá as tabelas separadas, e sim o resultado da junção, que é uma única tabela interna. Em algumas situações isso é necessário, mas existem desvantagens:

  • Normalmente, as tabelas carregadas ficam maiores e o Qlik Sense trabalha mais lentamente.
  • Algumas informações podem ser perdidas: a frequência (número de registros) na tabela original pode não mais estar disponível.

A funcionalidade Keep, que tem o efeito de reduzir uma ou ambas as tabelas à interseção dos dados da tabela antes de serem armazenadas no Qlik Sense, foi projetada para reduzir o número de casos que exigem o uso de junções explícitas.

Nota: Nesta documentação, o termo junção é geralmente utilizado para junções feitas antes da criação das tabelas internas. Entretanto, a associação, feita após a criação das tabelas internas, também é basicamente uma junção.

Junções dentro de um comando SQL SELECT

Com alguns drivers ODBC, é possível fazer uma junção no comando SELECT. É quase equivalente a fazer uma junção usando o prefixo Join.

No entanto, a maior parte dos drivers ODBC não é capaz de fazer uma junção externa completa (bidirecional). Eles podem apenas fazer uma junção externa à esquerda ou à direita. Uma junção externa à esquerda (ou à direita) inclui apenas combinações em que a chave de junção existe na tabela da esquerda (direita). Uma junção externa completa inclui qualquer combinação. O Qlik Sense faz automaticamente uma junção externa completa.

Além disso, fazer junções em comandos SELECT é muito mais complicado do que fazer junções no Qlik Sense.

Example:  

SELECT DISTINCTROW

[Order Details].ProductID, [Order Details].

UnitPrice, Orders.OrderID, Orders.OrderDate, Orders.CustomerID

FROM Orders

RIGHT JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID;

Esse comando SELECT une uma tabela que contém pedidos para uma empresa fictícia, com uma tabela que contém detalhes do pedido. É uma junção externa à direita, significando que todos os registros de OrderDetails serão incluídos, mesmo aqueles com um OrderID que não existe na tabela Orders. Entretanto, os pedidos existentes em Orders, mas não em OrderDetails, não serão incluídos.

Join

A forma mais simples de fazer uma junção é usar o prefixo Join no script, que une a tabela interna a outra tabela nomeada ou à última tabela criada anteriormente. A junção será externa, criando todas as combinações possíveis de valores das duas tabelas.

Example:  

LOAD a, b, c from table1.csv;

join LOAD a, d from table2.csv;

A tabela interna resultante tem os campos a, b, c e d. O número de registros é diferente dependendo dos valores de campo das duas tabelas.

Nota: Os nomes dos campos a serem unidos devem ser exatamente os mesmos. O número de campos a serem unidos é arbitrário. Normalmente, as tabelas devem ter um ou alguns campos em comum. Nenhum campo em comum gerará o produto cartesiano das tabelas. Também é possível ter todos os campos em comum, mas isso normalmente não faz sentido. A menos que o nome de uma tabela carregada anteriormente seja especificado no comando Join o prefixo Join utilizará a última tabela criada anteriormente. Dessa forma, a ordem dos dois comandos não é arbitrária.

Para obter mais informações, consulte Join.

Keep

O prefixo Join explícito no script de carga de dados executa uma junção completa das duas tabelas. O resultado é uma tabela. Em vários casos, essas junções resultarão em tabelas muito grandes. Uma das principais características do Qlik Sense é sua capacidade de fazer associações entre as tabelas, em vez de uni-las, reduzindo bastante o espaço usado na memória, aumentando a velocidade e oferecendo enorme flexibilidade. A funcionalidade keep foi projetada para reduzir o número de casos em que as junções explícitas precisam ser usadas.

O prefixo Keep entre dois comandos LOAD ou SELECT tem o efeito de reduzir uma ou ambas as tabelas à interseção dos dados da tabela antes de serem armazenadas no Qlik Sense. O prefixo Keep sempre deve ser precedido de uma das palavras-chave Inner, Left ou Right. A seleção de registros das tabelas é feita da mesma maneira que em uma junção correspondente. Entretanto, as duas tabelas não são unidas e serão armazenadas no Qlik Sense como duas tabelas nomeadas separadas.

Para obter mais informações, consulte Keep.

Inner

Os prefixos Join e Keep no script de carga de dados podem ser precedidos pelo prefixo Inner.

Se for usado antes de Join, especificará que a junção das duas tabelas deve ser interna. A tabela resultante contém apenas combinações entre as duas tabelas com um conjunto de dados completo de ambos os lados.

Se usado antes de Keep, especificará que as duas tabelas deverão ser reduzidas à sua interseção comum antes de serem armazenadas no Qlik Sense.

Example:  

Nestes exemplos, usamos as tabelas de fontes Table1 e Table2:

Table 1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

Inner Join

Primeiro, realizamos um Inner Join nas tabelas, resultando em um VTable, contendo apenas uma linha, o único registro existente em ambas as tabelas, com dados combinados de ambas as tabelas.

VTable:

SELECT * from Table1;

inner join SELECT * from Table2;

VTable
A B C
1 aa xx

Inner Keep

Se você realizar um Inner Keep, ainda terá duas tabelas. As duas tabelas serão, obviamente, associadas através do campo comum A.

VTab1:

SELECT * from Table1;

VTab2:

inner keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx

Para obter mais informações, consulte Inner.

Left

Os prefixos Join e Keep no script de carga de dados podem ser precedidos pelo prefixo left.

Se for usado antes de Join, ele especificará que a junção das duas tabelas deve ser à esquerda. A tabela resultante contém apenas combinações entre as duas tabelas com um conjunto de dados completo da primeira tabela.

Se usado antes de Keep, especificará que a segunda tabela deverá ser reduzida à sua interseção comum com a primeira tabela antes de ser armazenada no Qlik Sense.

Example:  

Nestes exemplos, usamos as tabelas de fontes Table1 e Table2:

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

Primeiro, um Left Join é realizado nas tabelas, resultando em um VTable, contendo todas as linhas da Table1, combinadas com os campos das linhas correspondentes na Table2.

VTable:

SELECT * from Table1;

left join SELECT * from Table2;

VTable
A B C
1 aa xx
2 cc -
3 ee -

Se você realizar um Left Keep, ainda terá duas tabelas. As duas tabelas serão, obviamente, associadas através do campo comum A.

VTab1:

SELECT * from Table1;

VTab2:

left keep SELECT * from Table2;

VTab1
A B
1 aa
2 cc
3 ee
VTab2
A C
1 xx

Para obter mais informações, consulte Left.

Right

Os prefixos Join e Keep no script de carga de dados podem ser precedidos pelo prefixo right.

Se for usado antes de Join, ele especificará que a junção das duas tabelas deve ser à direita. A tabela resultante contém apenas combinações entre as duas tabelas com um conjunto de dados completo da segunda tabela.

Se usado antes de Keep, especificará que a primeira tabela deverá ser reduzida à sua interseção comum com a segunda tabela antes de ser armazenada no Qlik Sense.

Example:  

Nestes exemplos, usamos as tabelas de fontes Table1 e Table2:

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

Primeiro, um Right Join é realizado nas tabelas, resultando em um VTable, contendo todas as linhas da Table2, combinadas com os campos das linhas correspondentes na Table1.

VTable:

SELECT * from Table1;

right join SELECT * from Table2;

VTable
A B C
1 aa xx
4 - yy

Se você realizar um Left Keep, ainda terá duas tabelas. As duas tabelas serão, obviamente, associadas através do campo comum A.

VTab1:

SELECT * from Table1;

VTab2:

right keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx
4 yy

Para obter mais informações, consulte Right.