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.

Cómo colocar una consulta anidada en un JOIN?

Digamos que tengo las siguientes dos tablas:

TABLA1

+-------+-------+-------+
| data1 | data2 | data3 |
+-------+-------+-------+
|     1 |    12 |    13 |
|     2 |    22 |    23 |
|     3 |    32 |    33 |
+-------+-------+-------+

TABLA2

+-------+-------+-------+
| data1 | data4 | data5 |
+-------+-------+-------+
|     1 |  NULL |   015 |
|     1 |    14 |   115 |
|     1 |    14 |   115 |
|     2 |  NULL |   025 |
|     2 |    24 |   125 |
|     2 |    24 |   125 |
|     3 |  NULL |   035 |
|     3 |    34 |   135 |
|     3 |    34 |   135 |
+-------+-------+-------+

Y tengo la siguiente consulta:

SELECT TABLE1.data1,
       TABLE1.data2,
       TABLE1.data3,
       (SELECT TOP 1
               data4
        FROM TABLE2
        WHERE data1 = TABLE1.data1
          AND data4 IS NOT NULL),
       (SELECT TOP 1
               data5
        FROM TABLE2
        WHERE data1 = TABLE1.data1
          AND data4 IS NOT NULL)
FROM TABLE1;

RESULTADO DE LA CONSULTA

+-------+-------+-------+-------+-------+
| data1 | data2 | data3 | data4 | data5 |
+-------+-------+-------+-------+-------+
|     1 |    12 |    13 |    14 |   115 |
|     2 |    22 |    23 |    24 |   125 |
|     3 |    32 |    33 |    34 |   135 |
+-------+-------+-------+-------+-------+

Suponiendo que la TABLA2 cumple estas dos condiciones:
1) Para cada data1, data4 puede ser 1 o tener el mismo valor en cada fila.
2) Para cada data1, data5 tendrá un valor para cada fila con data4 nulo y otro valor para cada fila con data4 no nulo.

¿Hay alguna manera de reescribir la consulta de tal manera que no tenga una consulta anidada en la parte SELECT? ¿Tal vez utilizando cláusulas JOIN? Lo pregunto porque me he dado cuenta de que el rendimiento de la consulta anidada en el SELECT es bastante deficiente. Sin embargo, si intento con un JOIN, termino duplicando las filas que tienen data4 diferente de nulo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible reescribir la consulta utilizando declaraciones JOIN para evitar consultas anidadas en la cláusula SELECT. Aquí tienes cómo:

    SELECT TABLE1.data1,
           TABLE1.data2,
           TABLE1.data3,
           TABLE2.data4,
           TABLE2.data5
    FROM TABLE1
    LEFT JOIN (
      SELECT data1, data4, data5
      FROM TABLE2
      WHERE data4 IS NOT NULL
    ) AS TABLE2
    ON TABLE1.data1 = TABLE2.data1;
    

    En esta consulta reescrita, utilizamos un LEFT JOIN con una subconsulta que filtra TABLE2 para incluir únicamente filas donde data4 no es nulo. Esto asegura que obtenemos solo una fila por grupo de data1. Luego, el resultado se une nuevamente a TABLE1 utilizando la columna data1.

    Ten en cuenta que todavía tenemos que filtrar las filas donde data4 es nulo en la subconsulta. Además, para las filas donde data4 no es nulo, habrá filas duplicadas, ya que hay múltiples filas en TABLE2 para cada grupo de data1 con diferentes valores de data5.

Comments are closed.