es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

LEFT JOIN EN valores clave NULL combinados con GROUP BY

Estoy usando Teradata SQL y escribí la siguiente consulta (presta atención al LEFT JOIN):

SELECT
    key1,
    secondvalue,
    count(DISTINCT firstvalue)
FROM
(
    SELECT
        t1.val AS firstvalue,
        t1.key1,
        t2.val AS secondvalue

    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.key1 = t1.key1 AND t1.key2 = t2.key2 AND t1.key3 = t2.key3
) AS Testcase
GROUP BY 1, 2

Algunas entradas para t1.key2 y t1.key3 (de la tabla del lado izquierdo) son NULL. En ese caso, las filas no aparecen en el resultado, ¿por qué? ¿Es esto específico de Teradata? Esperaría que un LEFT JOIN muestre filas con valores NULL.

Por ejemplo, si decido reducir la declaración LEFT JOIN a:

SELECT
    key1,
    secondvalue,
    count(DISTINCT firstvalue)
FROM
(
    SELECT
        t1.val AS firstvalue,
        t1.key1,
        t2.val AS secondvalue

    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.key1 = t1.key1
) AS Testcase
GROUP BY 1, 2

Aparecen más valores distintos para key1, lo cual no debería ser así, ¿verdad? Quiero ver todos los valores distintos para key1, incluso cuando key2 y key3 son NULL. Si no, quiero ver el valor específico de la segunda tabla.

Realmente no quiero asignar los valores NULL a otro valor primero.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que las filas con valores NULL para t1.key2 y t1.key3 no aparecen en la primera consulta es porque, en la declaración LEFT JOIN, la condición “t1.key1 = t1.key1” debería ser en realidad “t1.key1 = t2.key1”. Tal como está actualmente, el join es en realidad un INNER JOIN porque sólo está emparejando filas donde t1.key1 no es NULL.

    Para corregir esto, la declaración LEFT JOIN debería actualizarse a:

    LEFT JOIN table2 t2 ON t1.key1 = t2.key1 AND t1.key2 = t2.key2 AND t1.key3 = t2.key3

    Con este cambio, el LEFT JOIN mostrará todas las filas de t1, incluyendo las que tienen valores NULL para key2 y key3, y también mostrará las filas emparejadas de t2 si existen.

    La razón por la que se muestran más valores distintos para key1 en la segunda consulta es porque la condición LEFT JOIN “t1.key1 = t1.key1” es incorrecta de nuevo. Esto hace que t2 se una a las filas incorrectas en t1, lo que lleva a una mayor cantidad de valores distintos para key1.

    Para corregir esto, la declaración LEFT JOIN debería actualizarse a:

    LEFT JOIN table2 t2 ON t1.key1 = t2.key1

    Esto unirá correctamente t1 y t2 en key1, independientemente de si key2 y key3 son NULL o no.

    En resumen, la clave para obtener los resultados correctos con LEFT JOINs es asegurarse de que las condiciones de join sean correctas y que coincidan con el comportamiento esperado para manejar los valores NULL.

Comments are closed.