¿Cómo puede una UNIÓN EXTERNA IZQUIERDA devolver más registros de los que existen en la tabla izquierda?


Tengo una UNIÓN EXTERNA IZQUIERDA muy básica para devolver todos los resultados de la tabla izquierda y alguna información adicional de una tabla mucho más grande. La tabla de la izquierda contiene 4935 registros sin embargo, cuando ME FUI EXTERIOR UNIRSE a una tabla adicional el recuento de registros es significativamente mayor.

Por lo que sé, es un evangelio absoluto que una UNIÓN EXTERNA IZQUIERDA devolverá todos los registros de la tabla izquierda con registros coincidentes de la tabla derecha y valores nulos para cualquier fila que no pueda ser coincidente, como tal es mi entendimiento de que debería ser imposible devolver más filas de las que existen en la tabla de la izquierda, ¡pero está sucediendo de todos modos!

La consulta SQL sigue:

SELECT     SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM         SUSP.Susp_Visits LEFT OUTER JOIN
                      DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum

Tal vez he cometido un error en la sintaxis o mi comprensión de la UNIÓN EXTERNA IZQUIERDA es incompleta, espero que alguien pueda explicar cómo esto podría estar ocurriendo?

Postscript

Gracias por las grandes respuestas, mi comprensión de las UNIONES EXTERNAS IZQUIERDAS es ahora mucho mejor, ¿podría alguien sin embargo sugerir una manera esta consulta podría modificarse para que solo obtenga tantos registros devueltos como existan en la tabla de la izquierda?

Esta consulta es puramente para generar un informe y las coincidencias duplicadas simplemente confunden las cosas.

/ Postscript

Author: Jay Wilde, 2009-05-27

11 answers

La UNIÓN EXTERNA IZQUIERDA devolverá todos los registros de la tabla IZQUIERDA unidos con la tabla DERECHA cuando sea posible.

Si hay coincidencias, sin embargo, devolverá todas las filas que coincidan, por lo tanto, una fila en la IZQUIERDA que coincida con dos filas en la DERECHA regresará como dos FILAS, al igual que una UNIÓN INTERIOR.

EDITAR: En respuesta a su edición, acabo de echar un vistazo a su consulta y parece que solo está devolviendo datos de la tabla de la IZQUIERDA. Por lo tanto, si solo desea datos de la tabla DE LA IZQUIERDA, y solo desea que se devuelva una fila por cada fila en la tabla de la IZQUIERDA, entonces no tiene necesidad de realizar una UNIÓN en absoluto y solo puede hacer una SELECCIÓN directamente desde la tabla de la IZQUIERDA.

 137
Author: Robin Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 21:42:13
Table1                Table2
_______               _________
1                      2
2                      2
3                      5
4                      6

SELECT Table1.Id, Table2.Id FROM Table1 LEFT OUTER JOIN Table2 ON Table1.Id=Table2.Id

Resultados:

1,null
2,2
2,2
3,null
4,null
 87
Author: Andrew Lewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 15:38:26

No Es imposible. El número de registros en la tabla de la izquierda es el número mínimo de registros que devolverá. Si la tabla derecha tiene dos registros que coinciden con un registro en la tabla izquierda, devolverá dos registros.

 24
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 16:31:45

En respuesta a su postscript, eso depende de lo que le gustaría.

Está obteniendo (es posible) varias filas para cada fila de la tabla izquierda porque hay varias coincidencias para la condición de unión. Si desea que los resultados totales tengan el mismo número de filas que en la parte izquierda de la consulta, debe asegurarse de que las condiciones de unión causen una coincidencia de 1 a 1.

Alternativamente, dependiendo de lo que realmente desee, puede usar funciones de agregado (si, por ejemplo solo desea una cadena de la parte derecha, puede generar una columna que sea una cadena delimitada por comas de los resultados del lado derecho para esa fila izquierda.

Si solo está mirando 1 o 2 columnas de la unión externa, puede considerar usar una subconsulta escalar ya que se le garantizará 1 resultado.

 10
Author: Chris Cameron-Mills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 15:57:41

Cada registro de la tabla de la izquierda se devolverá tantas veces como haya registros coincidentes en la tabla de la derecha -- al menos 1, pero podría ser fácilmente más de 1.

 7
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 15:33:25

LEFT OUTER JOIN al igual que INNER JOIN (normal join) devolverá tantos resultados para cada fila de la tabla izquierda como coincidencias encuentre en la tabla derecha. Por lo tanto, puede tener muchos resultados, hasta N x M, donde N es el número de filas en la tabla izquierda y M es el número de filas en la tabla derecha.

Es el número mínimo de resultados siempre está garantizado en la UNIÓN EXTERNA IZQUIERDA para ser al menos N.

 7
Author: topchef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 15:34:33

¿Podría ser una relación de uno a muchos entre las tablas izquierda y derecha?

 6
Author: Ken Burkhardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 15:32:55

Preste atención si tiene una cláusula where en la tabla "lado derecho" de una consulta que contiene una unión externa izquierda... En caso de que no tenga ningún registro en el lado derecho que satisfaga la cláusula where, entonces el registro correspondiente de la tabla del lado izquierdo no aparecerá en el resultado de su consulta....

 6
Author: Serge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-06 09:58:03

Si necesita cualquier fila desde el lado derecho

SELECT SuspReason, SiteID FROM(
    SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID, ROW_NUMBER()
    OVER(PARTITION BY SUSP.Susp_Visits.SiteID) AS rn
    FROM SUSP.Susp_Visits
    LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
) AS t
WHERE rn=1

O simplemente

SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits WHERE EXISTS(
    SELECT DATA.Dim_Member WHERE SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
)
 4
Author: A-K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-03 03:38:08

Parece que hay varias filas en los DATOS.Dim_Member tabla por SUSP.Susp_Visits fila.

 1
Author: bdukes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 15:32:56

Si varias filas (x) en Dim_Member están asociadas con una sola fila en Susp_Visits, habrá x filas en el conjunto resul.

 1
Author: Manu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 15:33:38