Combinando tabelas com Join e Keep

Uma 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 QlikView, as junções podem ser feitas no script, produzindo tabelas lógicas.

Assim, a lógica do QlikView 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 QlikView 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 QlikView, 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.

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á um outer join, 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.

Keep

Uma das principais características do QlikView é 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 QlikView. 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 QlikView como duas tabelas nomeadas separadas.

Inner

Os prefixos Join e Keep na linguagem de script do QlikView 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 QlikView.

Example:  

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

Inner Tabelas de fonte com os exemplos

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;

Exemplo de Inner Join

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;

Exemplo de Inner Keep

Left

Os prefixos Join e Keep na linguagem de script do QlikView 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 QlikView.

Example:  

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

Left Tabelas de fonte com os exemplos

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;

Exemplo de Left Join

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;

Exemplo de Left Keep

Right

Os prefixos Join e Keep na linguagem de script do QlikView 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 QlikView.

Example:  

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

Right Tabelas de fonte com os exemplos

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;

Exemplo de Right Join

Se você realizar um Right 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;

Exemplo de Right Keep