tipos outer left sql sql-server sql-server-2005 tsql

outer - tipos de join mysql



¿Cómo puede un LEFT OUTER JOIN devolver más registros de los que existen en la tabla de la izquierda? (11)

Tengo una MUESTRA EXTREMA 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, pero cuando dejé OUTER JOIN en una tabla adicional, el recuento de registros es significativamente mayor.

Por lo que sé, es un evangelio absoluto que IZQUIERDA UNIÓN EXTERNA regrese todos los registros de la tabla de la izquierda con registros coincidentes de la tabla correcta y valores nulos para las filas que no se pueden emparejar, por lo que entiendo que debería será imposible devolver más filas que las que existen en la tabla de la izquierda, ¡pero está sucediendo de todos modos!

Consulta SQL a continuación:

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

Quizás he cometido un error en la sintaxis o en mi comprensión de que IZQUIERDA OUTER JOIN está incompleta, sea cual sea el motivo por el que me estoy volviendo loco aquí, ojalá alguien pueda explicar cómo podría estar ocurriendo esto.

Posdata

Gracias por las grandes respuestas, mi comprensión de LEFT OUTER JOINS ahora es mucho mejor, ¿podría alguien sugerir alguna manera de modificar esta consulta para que solo obtenga tantos registros como los existentes en la tabla de la izquierda?

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

/Posdata


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


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


El LEFT OUTER JOIN devolverá todos los registros de la tabla IZQUIERDA unidos con la tabla DERECHA cuando sea posible.

Sin embargo, si hay coincidencias, seguirá devolviendo todas las filas que coincidan, por lo tanto, una fila en la IZQUIERDA que coincida con dos filas en DERECHA regresará como dos FILAS, al igual que una UNIÓN INTERNA.

EDITAR: En respuesta a su edición, acabo de echarle un vistazo a su consulta y parece que solo está devolviendo datos de la tabla IZQUIERDA. Por lo tanto, si solo desea datos de la tabla IZQUIERDA, y solo desea que se devuelva una fila para cada fila en la tabla IZQUIERDA, entonces no necesita realizar un ENLACE en absoluto y puede hacer un SELECTO directamente desde la tabla IZQUIERDA.


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

Obtendrá (posiblemente) varias filas para cada fila en su tabla izquierda porque hay múltiples coincidencias para la condición de unión. Si desea que sus resultados totales tengan el mismo número de filas que hay en la parte izquierda de la consulta, debe asegurarse de que sus condiciones de combinación provoquen una coincidencia 1 a 1.

Alternativamente, dependiendo de lo que realmente desee, puede usar funciones agregadas (si, por ejemplo, solo quiere una cadena de la parte derecha, podría generar una columna que es una cadena delimitada por comas de los resultados del lado derecho de esa fila de la izquierda).

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


IZQUIERDA UNIÓN EXTERIOR al igual que INNER JOIN (unión normal) devolverá tantos resultados para cada fila en la tabla izquierda como tantas coincidencias encuentre en la tabla correcta. 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 la cantidad mínima de resultados que siempre está garantizada en IZQUIERDA UNIÓN EXTERNA para ser al menos N.


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 correcta tiene dos registros que coinciden con un registro en la tabla de la izquierda, devolverá dos registros.


Parece que hay varias filas en la tabla DATA.Dim_Member por fila SUSP.Susp_Visits.


Preste atención si tiene una cláusula where en la tabla "derecha" de una consulta que contiene una combinació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 del ''lado izquierdo'' ''tabla no aparecerá en el resultado de su consulta ....


Si necesita solo una 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 solo

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 )


si múltiples (x) filas en Dim_Member están asociadas con una sola fila en Susp_Visits, habrá x filas en el conjunto resultante.


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