Combinar tablas con Join y Keep
Un join es una operación que usa dos tablas y las combina en una sola. Los registros de la tabla resultante son combinaciones de registros de las tablas originales, normalmente de manera que los dos registros contribuyen a que cualquier combinación en la tabla resultante tenga un valor común para uno o varios campos comunes, lo que se conoce como un natural join. En Qlik Sense se pueden efectuar joins en el script, produciendo tablas lógicas.
Es posible unir tablas ya en el script. La lógica de Qlik Sense no percibirá entonces dichas tablas como separadas, sino como el resultado de la unión (join), es decir, como si se tratara de una única tabla lógica. En algunas situaciones esto puede ser necesario, pero tiene sus inconvenientes:
- Las tablas cargadas suelen aumentar de tamaño, lo cual hace que Qlik Sense funcione a menor velocidad.
- Parte de la información podría perderse: la frecuencia (el número de registros) de la tabla original podría no estar ya disponible.
La funcionalidad de Keep, que tiene el efecto de reducir una o las dos tablas a la intersección de los datos de la tabla antes de que las tablas se almacenen en Qlik Sense, se ha diseñado para reducir el número de casos en los que es necesario usar uniones explícitas.
Joins dentro de una sentencia SQL SELECT
Con algunos drivers de ODBC es posible hacer una unión join dentro de la sentencia SELECT. Esto es casi equivalente a hacer una unión usando el prefijo Join.
Sin embargo, la mayoría de drivers ODBC no pueden realizar una unión externa completa (outer join bidireccional). Solo son capaces de hacer una unión externa izquierda o derecha. Una unión externa izquierda (o derecha) solo incluye aquellas combinaciones donde la clave de la unión figura en la tabla izquierda (o derecha). Una unión externa completa incluye cualquier combinación. Qlik Sense realiza una unión externa completa de forma automática.
Además, hacer joins en sentencias SELECT es mucho más complicado que hacer joins en Qlik Sense.
Ejemplo:
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;
Esta sentencia SELECT une una tabla que contiene pedidos a una empresa ficticia, con una tabla que contiene detalles de pedidos. Es un right outer join, lo que significa que todos los registros de OrderDetails se incluyen, también los que tienen un OrderID que no existe en la tabla Orders. Los pedidos que existen en Orders pero no en OrderDetails, no obstante, no se incluyen.
Join
La manera más fácil de hacer un join es mediante la inclusión del prefijo Join en el script, el cual une una tabla interna con otra tabla designada o con la última tabla previamente creada. La unión será una unión externa, creando todas las combinaciones posibles de valores de ambas tablas.
Ejemplo:
LOAD a, b, c from table1.csv;
join LOAD a, d from table2.csv;
La tabla interna resultante tiene los campos a, b, c y d. El número de registros difiere dependiendo de los valores de campo de las dos tablas.
Para más información, vea Join.
Keep
El prefijo Join explícito en el script de carga de datos realiza una unión completa de las dos tablas. El resultado es una sola tabla. El resultado de estas uniones es, en muchos casos, una tabla muy extensa. Una de las principales características de Qlik Sense es su capacidad de hacer asociaciones entre tablas en lugar de unirlas (mediante join). Esto permite ahorrar mucho espacio en la memoria e incrementar la velocidad, lo que se traduce en una flexibilidad enorme. La funcionalidad keep se ha diseñado para reducir el número de casos en los que se tengan que usar joins explícitos.
El prefijo Keep entre dos sentencias LOAD o SELECT tiene el efecto de reducir una o las dos tablas a la intersección de los datos de la tabla antes de que se almacenen en Qlik Sense. El prefijo Keep debe ir precedido siempre de una de las palabras clave Inner, Left o Right. La selección de los registros desde las tablas se hace de la misma forma que en un join correspondiente. No obstante, las dos tablas no se unen y se almacenan en Qlik Sense como dos tablas independientes y con distintos nombres.
Para más información, vea Keep.
Inner
Los prefijos Join y Keep en el script de carga de datos pueden ir precedidos por el prefijo Inner.
Si se usa antes de Join, especifica que el join entre las dos tablas debería ser un inner join. La tabla resultante contiene solo combinaciones ente las dos tablas, con un conjunto completo de datos de ambas partes.
Si se usa antes de Keep, especifica que las dos tablas deberían reducirse a su intersección común antes de ser almacenadas en Qlik Sense.
Ejemplo:
En estos ejemplos utilizamos las tablas fuente Table1 y Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Inner Join
Primero hacemos un Inner Join en las tablas, lo que da como resultado a VTable, que contiene solo una fila, el único registro que existe en ambas tablas, con datos combinados de ambas tablas.
VTable:
SELECT * from Table1;
inner join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
Inner Keep
Si en cambio realizamos un Inner Keep, todavía tendremos dos tablas. Las dos tablas están asociadas por el campo común A.
VTab1:
SELECT * from Table1;
VTab2:
inner keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
Para más información, vea Inner.
Left
Los prefijos Join y Keep en el script de carga de datos pueden ir precedidos por el prefijo left.
Si se usa antes de Join, especifica que el join entre las dos tablas debería ser un left join. La tabla resultante contiene solo combinaciones entre las dos tablas, con el conjunto de datos completo de la primera tabla.
Si se usa antes de Keep, especifica que la segunda tabla debe reducirse a su intersección común con la primera tabla antes de ser almacenada en Qlik Sense.
Ejemplo:
En estos ejemplos utilizamos las tablas fuente Table1 y Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Primero realizamos un Left Join en las tablas, dando como resultado VTable, que contiene todas las filas de Table1, combinadas con campos de las correspondientes filas en Table2.
VTable:
SELECT * from Table1;
left join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
2 | cc | - |
3 | ee | - |
Si en cambio realizamos un Left Keep, todavía tendremos dos tablas. Las dos tablas están asociadas por el campo común A.
VTab1:
SELECT * from Table1;
VTab2:
left keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
Para más información, vea Left.
Right
Los prefijos Join y Keep en el script de carga de datos pueden ir precedidos por el prefijo right.
Si se usa antes de Join, especifica que el join entre las dos tablas debería ser un right join. La tabla resultante solo contiene combinaciones entre las dos tablas, con un conjunto completo de datos de la segunda tabla.
Si se usa antes de Keep, especifica que la primera tabla debe reducirse a su intersección común con la segunda tabla antes de ser almacenada en Qlik Sense.
Ejemplo:
En estos ejemplos utilizamos las tablas fuente Table1 y Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Primero realizamos un Right Join en las tablas, dando como resultado VTable, que contiene todas las filas de Table2, combinadas con campos de las correspondientes filas en Table1.
VTable:
SELECT * from Table1;
right join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
4 | - | yy |
Si en cambio realizamos un Right Keep, todavía tendremos dos tablas. Las dos tablas están asociadas por el campo común A.
VTab1:
SELECT * from Table1;
VTab2:
right keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
4 | yy |
Para más información, vea Right.