2009-05-27 41 views
99

Tengo una MUESTRA EXTREMA IZQUIERDA muy básica para devolver todos los resultados de la tabla de la izquierda y algo de 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.¿Cómo puede un LEFT OUTER JOIN devolver más registros de los que existen en la tabla de la izquierda?

Por lo que yo sé, es un evangelio absoluto que una UNIÓN EXTREMA IZQUIERDA regrese todos los registros de la tabla izquierda con registros coincidentes de la tabla correcta y valores nulos para las filas que no se pueden combinar, como tal es mi entendiendo 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 siguiente:

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 mi comprensión de la combinación externa izquierda es incompleta, sea cual sea la razón por la que estoy volviendo loco aquí, espero que alguien puede explicar cómo este podría estar ocurriendo?

Postscript

Gracias por las respuestas grea, mi comprensión de la IZQUIERDA combinaciones externas está ahora mucho mejor, sin embargo alguien podría sugerir una forma de esta consulta podría ser modificado de manera que solo me dan volvieron tantos registros como las que existen en el mesa izquierda?

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

/PostScript

+3

Para "obtener tantos registros como exista en la tabla de la izquierda", debe especificar qué fila del lado derecho elige si hay múltiples coincidencias –

+0

¿cómo se especifica esto? Me gustaría que se devuelva el primer partido. –

+0

tiene que definir qué significa la primera coincidencia. ¿Desea el registro más antiguo, el que tiene la identificación más alta o qué? – HLGEM

Respuesta

121

La combinación externa izquierda devolverá todos los registros de la tabla izquierda unidas con la tabla de la derecha siempre que sea posible.

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

EDIT: 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.

6

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

1

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

21

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.

7

Cada registro de la tabla de la izquierda que se obtiene es muchas veces ya que hay registros coincidentes en la tabla de la derecha - al menos 1, pero fácilmente podría haber más de 1.

1

Si varios (x) en filas Dim_Member están asociados con una sola fila en Susp_Visits, habrá x filas en el conjunto resultante.

7

UNIÓN EXTERIOR EXTERIOR como 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 el número mínimo de resultados siempre se garantiza en combinación externa izquierda que ser al menos N.

+0

Empecé a pensar cuando el número de filas es igual a N x M y la única situación real que me viene a la mente es cuando N o M equivalen a 1. ¿Estás de acuerdo? – MrKiller21

+1

No, yo no. No debe pensar en una condición de unión como igualdad de igualdad unirse solo. Puede ser una condición arbitraria, p. rangos de fechas, desigualdades, etc. Dos casos extremos: (a) N filas no tienen una sola coincidencia entre M filas, luego los resultados de la combinación externa izquierda en N filas coinciden con NULLs. (b) cada una de N filas coincide con todas las M filas, el resultado es N x M filas establecidas. – topchef

+0

Tienes razón, estaba pensando en uniones solo en términos de igualdad clave. Me gusta tu ejemplo del "caso b". Creo que "cada una de N filas coincide con todas las M filas" es una receta general para cuando se devuelven N x M filas, lo cual es bastante imposible de visualizar cuando solo se piensa en la igualdad de claves. – MrKiller21

78
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 
4

Si necesita cualquier una fila del 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 
) 
+0

Como no proporcionó DDL ni DML, no realicé la prueba. De todos modos, creo que EXISTS es lo que quieres. Prueba esto: SELECT SuspReason, SiteID FROM (SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID, ROW_NUMBER() OVER (partición POR ORDEN SUSP.Susp_Visits.SiteID POR SUSP.Susp_Visits.SiteID) AS rn DE Susp. Susp_Visits LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum) AS t WHERE rn = 1 –

10

En respuesta a su posdata, eso depende de lo que desee.

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 para esa fila izquierda .

Si sólo está buscando en 1 o 2 columnas de la combinación externa se puede considerar utilizar una subconsulta escalar ya que se le garantiza 1 resultado. atención

+3

Esta es una buena respuesta ya que ofrece sugerencias sobre cómo devolver solo las filas de la tabla de la izquierda. – karns

6

de pago si usted tiene una cláusula en donde en el "derecho tabla lateral 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 ord de la tabla 'lado izquierdo' no aparecerá en el resultado de su consulta ....

+0

Debería agregar la condición a la cláusula ON de la UNIÓN EXTREMA IZQUIERDA correspondiente. – Mik

Cuestiones relacionadas