ClickHouse/docs/es/sql-reference/statements/select/join.md
2020-10-13 20:23:29 +03:00

10 KiB

machine_translated machine_translated_rev
true 72537a2d52

Cláusula JOIN

Join produce una nueva tabla combinando columnas de una o varias tablas utilizando valores comunes a cada una. Es una operación común en bases de datos con soporte SQL, que corresponde a álgebra relacional unir. El caso especial de una combinación de tabla a menudo se conoce como “self-join”.

Sintaxis:

SELECT <expr_list>
FROM <left_table>
[GLOBAL] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI|ANY|ASOF] JOIN <right_table>
(ON <expr_list>)|(USING <column_list>) ...

Expresiones de ON y columnas de USING cláusula se llaman “join keys”. A menos que se indique lo contrario, join produce un Producto cartesiano de filas con coincidencia “join keys”, lo que podría producir resultados con muchas más filas que las tablas de origen.

Tipos admitidos de JOIN

Todo estándar SQL JOIN tipos son compatibles:

  • INNER JOIN, sólo se devuelven las filas coincidentes.
  • LEFT OUTER JOIN, filas no coincidentes de la tabla izquierda se devuelven además de las filas coincidentes.
  • RIGHT OUTER JOIN, filas no coincidentes de la tabla izquierda se devuelven además de las filas coincidentes.
  • FULL OUTER JOIN, las filas que no coinciden de ambas tablas se devuelven además de las filas coincidentes.
  • CROSS JOIN, produce el producto cartesiano de tablas enteras, “join keys” ser ni indicado.

JOIN sin tipo especificado implica INNER. Palabra clave OUTER se puede omitir con seguridad. Sintaxis alternativa para CROSS JOIN está especificando múltiples tablas en Cláusula FROM separados por comas.

Tipos de unión adicionales disponibles en ClickHouse:

  • LEFT SEMI JOIN y RIGHT SEMI JOIN, una lista blanca en “join keys”, sin producir un producto cartesiano.
  • LEFT ANTI JOIN y RIGHT ANTI JOIN, una lista negra sobre “join keys”, sin producir un producto cartesiano.
  • LEFT ANY JOIN, RIGHT ANY JOIN and INNER ANY JOIN, partially (for opposite side of LEFT and RIGHT) or completely (for INNER and FULL) disables the cartesian product for standard JOIN types.
  • ASOF JOIN and LEFT ASOF JOIN, joining sequences with a non-exact match. ASOF JOIN usage is described below.

Setting

!!! note "Nota" El valor de rigor predeterminado se puede anular usando Por favor, introduzca su dirección de correo electrónico configuración.

ASOF JOIN Uso

ASOF JOIN es útil cuando necesita unir registros que no tienen una coincidencia exacta.

Tablas para ASOF JOIN debe tener una columna de secuencia ordenada. Esta columna no puede estar sola en una tabla y debe ser uno de los tipos de datos: UInt32, UInt64, Float32, Float64, Date, y DateTime.

Sintaxis ASOF JOIN ... ON:

SELECT expressions_list
FROM table_1
ASOF LEFT JOIN table_2
ON equi_cond AND closest_match_cond

Puede usar cualquier número de condiciones de igualdad y exactamente una condición de coincidencia más cercana. Por ejemplo, SELECT count() FROM table_1 ASOF LEFT JOIN table_2 ON table_1.a == table_2.b AND table_2.t <= table_1.t.

Condiciones admitidas para la coincidencia más cercana: >, >=, <, <=.

Sintaxis ASOF JOIN ... USING:

SELECT expressions_list
FROM table_1
ASOF JOIN table_2
USING (equi_column1, ... equi_columnN, asof_column)

ASOF JOIN utilizar equi_columnX para unirse a la igualdad y asof_column para unirse en el partido más cercano con el table_1.asof_column >= table_2.asof_column condición. El asof_column columna siempre el último en el USING clausula.

Por ejemplo, considere las siguientes tablas:

     table_1                           table_2
  event   | ev_time | user_id       event   | ev_time | user_id
----------|---------|----------   ----------|---------|----------
              ...                               ...
event_1_1 |  12:00  |  42         event_2_1 |  11:59  |   42
              ...                 event_2_2 |  12:30  |   42
event_1_2 |  13:00  |  42         event_2_3 |  13:00  |   42
              ...                               ...

ASOF JOIN puede tomar la marca de tiempo de un evento de usuario de table_1 y encontrar un evento en table_2 donde la marca de tiempo es la más cercana a la marca de tiempo del evento table_1 correspondiente a la condición de coincidencia más cercana. Los valores de marca de tiempo iguales son los más cercanos si están disponibles. Aquí, el user_id se puede utilizar para unirse a la igualdad y el ev_time columna se puede utilizar para unirse en el partido más cercano. En nuestro ejemplo, event_1_1 se puede unir con event_2_1 y event_1_2 se puede unir con event_2_3, pero event_2_2 no se puede unir.

!!! note "Nota" ASOF unirse es ni apoyado en el Unir motor de mesa.

Unión distribuida

Hay dos formas de ejecutar la unión que involucra tablas distribuidas:

  • Cuando se utiliza una normal JOIN, la consulta se envía a servidores remotos. Las subconsultas se ejecutan en cada una de ellas para crear la tabla correcta, y la unión se realiza con esta tabla. En otras palabras, la tabla correcta se forma en cada servidor por separado.
  • Cuando se utiliza GLOBAL ... JOIN, primero el servidor requestor ejecuta una subconsulta para calcular la tabla correcta. Esta tabla temporal se pasa a cada servidor remoto y las consultas se ejecutan en ellos utilizando los datos temporales que se transmitieron.

Tenga cuidado al usar GLOBAL. Para obtener más información, consulte Subconsultas distribuidas apartado.

Recomendaciones de uso

Procesamiento de celdas vacías o NULL

Al unir tablas, pueden aparecer las celdas vacías. Configuración Sistema abierto. definir cómo ClickHouse llena estas celdas.

Si el JOIN las llaves son NULL campos, las filas donde al menos una de las claves tiene el valor NULL no se unen.

Sintaxis

Las columnas especificadas en USING debe tener los mismos nombres en ambas subconsultas, y las otras columnas deben tener un nombre diferente. Puede utilizar alias para cambiar los nombres de las columnas en subconsultas.

El USING clause especifica una o más columnas a unir, lo que establece la igualdad de estas columnas. La lista de columnas se establece sin corchetes. No se admiten condiciones de unión más complejas.

Limitaciones de sintaxis

Para múltiples JOIN cláusulas en una sola SELECT consulta:

  • Tomando todas las columnas a través de * está disponible solo si se unen tablas, no subconsultas.
  • El PREWHERE cláusula no está disponible.

Para ON, WHERE, y GROUP BY clausula:

  • Las expresiones arbitrarias no se pueden utilizar en ON, WHERE, y GROUP BY cláusulas, pero puede definir una expresión en un SELECT cláusula y luego usarla en estas cláusulas a través de un alias.

Rendimiento

Cuando se ejecuta un JOIN, no hay optimización del orden de ejecución en relación con otras etapas de la consulta. La combinación (una búsqueda en la tabla de la derecha) se ejecuta antes de filtrar WHERE y antes de la agregación.

Cada vez que se ejecuta una consulta JOIN, la subconsulta se ejecuta de nuevo porque el resultado no se almacena en caché. Para evitar esto, use el especial Unir motor de tabla, que es una matriz preparada para unirse que siempre está en RAM.

En algunos casos, es más eficiente de usar IN en lugar de JOIN.

Si necesita un JOIN para unirse a tablas de dimensión (son tablas relativamente pequeñas que contienen propiedades de dimensión, como nombres para campañas publicitarias), un JOIN podría no ser muy conveniente debido al hecho de que se vuelve a acceder a la tabla correcta para cada consulta. Para tales casos, hay un “external dictionaries” característica que debe utilizar en lugar de JOIN. Para obtener más información, consulte Diccionarios externos apartado.

Limitaciones de memoria

De forma predeterminada, ClickHouse usa el hash unirse algoritmo. ClickHouse toma el <right_table> y crea una tabla hash para ello en RAM. Después de algún umbral de consumo de memoria, ClickHouse vuelve a fusionar el algoritmo de unión.

Si necesita restringir el consumo de memoria de la operación de unión, use la siguiente configuración:

Cuando se alcanza cualquiera de estos límites, ClickHouse actúa como el join_overflow_mode configuración instruye.

Ejemplos

Ejemplo:

SELECT
    CounterID,
    hits,
    visits
FROM
(
    SELECT
        CounterID,
        count() AS hits
    FROM test.hits
    GROUP BY CounterID
) ANY LEFT JOIN
(
    SELECT
        CounterID,
        sum(Sign) AS visits
    FROM test.visits
    GROUP BY CounterID
) USING CounterID
ORDER BY hits DESC
LIMIT 10
┌─CounterID─┬───hits─┬─visits─┐
│   1143050 │ 523264 │  13665 │
│    731962 │ 475698 │ 102716 │
│    722545 │ 337212 │ 108187 │
│    722889 │ 252197 │  10547 │
│   2237260 │ 196036 │   9522 │
│  23057320 │ 147211 │   7689 │
│    722818 │  90109 │  17847 │
│     48221 │  85379 │   4652 │
│  19762435 │  77807 │   7026 │
│    722884 │  77492 │  11056 │
└───────────┴────────┴────────┘