Saltar al contenido principal

Combinar tablas con Join y Keep

EN ESTA PÁGINA

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.

Nota: En esta documentación se utiliza el término unir (join) generalmente para referirse a las uniones efectuadas antes de crear las tablas internas. Sin embargo, la asociación que se realiza una vez creadas las tablas lógicas, también es un join en esencia.

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.

Example:  

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.

Nota: Los nombres de los campos que se desea unir deberán ser exactamente iguales. El número de campos que se van a unir es arbitrario. Normalmente, las tablas deberían tener uno o varios campos en común. Si no tienen ningún campo en común, se devuelve el producto cartesiano de las tablas. También es posible tener todos los campos en común, pero en general no tiene sentido. A menos que se haya especificado el nombre de una tabla previamente cargada en la sentencia Join el prefijo Join utiliza la última tabla previamente creada. Por lo tanto, el orden de las dos sentencias no es arbitrario.

Para más información, vea Join.

Uso de Join

El prefijo explícito Join en el lenguaje de script de Qlik Sense realiza una unión completa (full join) de las dos tablas. El resultado es una sola tabla. Tales uniones a menudo pueden dar como resultado tablas muy grandes.

Haga lo siguiente:

  1. Abra la app Tutorial de script avanzado.
  2. Agregue una nueva sección de script en el Editor de carga de datos.
  3. Denomine a la sección Transactions.
  4. En DataFiles en el menú a la derecha, haga clic en Seleccionar datos.

  5. Cargue y después seleccione Transactions.csv.
  6. Sugerencia: En Nombres de campo, asegúrese de que Nombres de campo incluidos está seleccionado para que se incluyan los nombres de los campos de tabla cuando cargue los datos.
  7. En la ventana Seleccionar datos de, haga clic en Insertar script.
  8. Cargue y a continuación seleccione Salesman.xlsx.
  9. En la ventana Seleccionar datos de, haga clic en Insertar script.
  10. Su script debería tener el aspecto siguiente:

    LOAD "Transaction ID", "Salesman ID", Product, "Serial No", "ID Customer", "List Price", "Gross Margin" FROM [lib://DataFiles/Transactions.csv] (txt, codepage is 28591, embedded labels, delimiter is ',', msq); LOAD "Salesman ID", Salesman, "Distributor ID" FROM [lib://DataFiles/Salesman.xlsx] (ooxml, embedded labels, table is Salesman);

  11. Haga clic en Cargar datos.
  12. Abra el Visor del modelo de datos. El modelo de datos tendrá el siguiente aspecto:
  13. Modelo de datos: Tablas Transactions, Salesman y Product
    Data model, Transactions, Salesman, and Product tables.

No obstante, tener las tablas Transactions y Salesman separadas puede no ser el resultado deseable. Puede que desee unir ambas tablas.

Haga lo siguiente:

  1. Para dar un nombre a la tabla unida, agregue la siguiente línea sobre la primera sentencia LOAD:
  2. Transactions:

  3. Para unir las tablas Transactions y Salesman, agregue la siguiente línea encima de la segunda sentencia LOAD:
  4. Join(Transactions)

    Su script debería tener el aspecto siguiente:

    Transactions:
    LOAD
        "Transaction ID",
        "Salesman ID",
        Product,
        "Serial No",
        "ID Customer",
        "List Price",
        "Gross Margin"
    FROM [lib://DataFiles/Transactions.csv]
    (txt, codepage is 28591, embedded labels, delimiter is ',', msq);
    
    Join(Transactions)
    LOAD
        "Salesman ID",
        Salesman,
        "Distributor ID"
    FROM [lib://DataFiles/Salesman.xlsx]
    (ooxml, embedded labels, table is Salesman);

  5. Haga clic en Cargar datos.
  6. Abra el Visor del modelo de datos. El modelo de datos tendrá el siguiente aspecto:
  7. Modelo de datos: Tablas Transactions y Product
    Data model following Join.

    Todos los campos de las tablas Transactions y Salesman están combinados ahora en una sola tabla Transactions.

Nota: Si desea más información sobre cuándo usar Join, vea estos blogs en Qlik Community: To Join or not to Join, Mapping as an Alternative to Joining. Los comportamientos se discuten en el contexto de QlikView. No obstante, la lógica se aplica igualmente a Qlik Sense.

Keep

Una de las principales características de Qlik Sense es su capacidad de hacer asociaciones entre tablas en lugar de unirlas (mediante join). Esto reduce mucho espacio en memoria e incrementa la velocidad, lo que se traduce en una flexibilidad enorme. La funcionalidad de 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 reduce 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.

Example:  

En estos ejemplos utilizamos las tablas fuente Table1 y Table2.

Tenga en cuenta que esto son únicamente ejemplos. No hay ejercicios de acompañamiento que completar en Qlik Sense.

Table 1
A B
1 aa
2 cc
3 ee
Table2
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;

VTable
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;

VTab1
A B
1 aa
VTab2
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.

Example:  

En estos ejemplos utilizamos las tablas fuente Table1 y Table2.

Table1
A B
1 aa
2 cc
3 ee
Table2
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;

VTable
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;

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

Para más información, vea Left.

Right

Los prefijos Join y Keep en el lenguaje de script de Qlik Sense 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.

Example:  

En estos ejemplos utilizamos las tablas fuente Table1 y Table2.

Table1
A B
1 aa
2 cc
3 ee
Table2
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;

VTable
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;

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

Para más información, vea Right.