mysql - tablas - multiplicacion para niños
¿Cómo decido cuándo usar las uniones correctas/uniones izquierdas o uniones internas o cómo determinar qué tabla está de qué lado? (3)
Creo que lo que estás buscando es hacer una LEFT JOIN
comenzando desde la tabla principal para devolver todos los registros de la tabla principal, independientemente de si tienen datos válidos en los combinados (como lo indican los dos círculos superiores izquierdos en el gráfico )
Los JOIN se llevan a cabo de forma sucesiva, por lo tanto, si tiene 4 tablas para unirse, y siempre quiere todos los registros de su tabla principal, debe continuar LEFT JOIN
todo momento, por ejemplo:
SELECT * FROM main_table
LEFT JOIN sub_table ON main_table.ID = sub_table.main_table_ID
LEFT JOIN sub_sub_table on main_table.ID = sub_sub_table.main_table_ID
Si INNER JOIN
SE UNE al sub_sub_table, inmediatamente reducirá su conjunto de resultados, incluso si usted hizo un LEFT JOIN
en el sub_table.
Recuerde, al hacer LEFT JOIN
, necesita dar cuenta de los valores NULL
que se devuelven. Porque si no se puede unir ningún registro con la tabla principal, una UNIÓN LEFT JOIN
obliga a que ese campo aparezca independientemente y contendrá un NULO. INNER JOIN
obviamente solo "tirará" la fila en su lugar porque no hay un enlace válido entre los dos (no hay un registro correspondiente basado en los ID a los que te has unido)
Sin embargo, mencionas que tienes una declaración en la que se filtran las filas que estás buscando, por lo que tu pregunta en JOIN es nula, porque ese no es tu problema real. (Esto es si entiendo tus comentarios correctamente)
Conozco el uso de combinaciones, pero a veces me encuentro con una situación así cuando no puedo decidir qué combinación será adecuada, una izquierda o la derecha .
Aquí está la consulta donde estoy atrapado.
SELECT count(ImageId) as [IndividualRemaining],
userMaster.empName AS ID#,
CONVERT(DATETIME, folderDetails.folderName, 101) AS FolderDate,
batchDetails.batchName AS Batch#,
Client=@ClientName,
TotalInloaded = IsNull(@TotalInloaded,0),
PendingUnassigned = @PendingUnassigned,
InloadedAssigned = IsNull(@TotalAssigned,0),
TotalProcessed = @TotalProcessed,
Remaining = @Remaining
FROM
batchDetails
Left JOIN folderDetails ON batchDetails.folderId = folderDetails.folderId
Left JOIN imageDetails ON batchDetails.batchId = imageDetails.batchId
Left JOIN userMaster ON imageDetails.assignedToUser = userMaster.userId
WHERE folderDetails.ClientId =@ClientID and verifyflag=''n''
and folderDetails.FolderName IN (SELECT convert(VARCHAR,Value) FROM dbo.Split(@Output,'',''))
and userMaster.empName <> ''unused''
GROUP BY userMaster.empName, folderDetails.folderName, batchDetails.batchName
Order BY folderDetails.Foldername asc
En dos conjuntos:
Use una combinación externa completa cuando desee todos los resultados de ambos conjuntos.
Use una combinación interna cuando solo desee los resultados que aparecen en ambos conjuntos.
Use una combinación externa izquierda cuando desee todos los resultados del conjunto a, pero si el conjunto b tiene datos relevantes para algunos de los registros del conjunto a, entonces también desea usar esos datos en la misma consulta también.
Por favor, consulte la siguiente imagen:
Sí, depende de la situación en la que te encuentres
¿Por qué usar SQL JOIN?
Respuesta : Use el JOIN de SQL siempre que se deba acceder a varias tablas a través de una instrucción SQL SELECT y no se deben devolver resultados si no hay una coincidencia entre las tablas JOINed.
Leer este artículo original en The Code Project te ayudará mucho: Representación visual de SQL Joins .
También verifique esta publicación: SQL SERVER - Mejor rendimiento - ¿LEFT JOIN o NOT IN? .
Encuentre el original en: Diferencia entre JOIN y OUTER JOIN en MySQL .