obtengo resultados diferentes basados en una condición de filtro en una consulta en función de dónde coloco la condición del filtro. ¿Mi pregunta esSQL estándar con respecto a las condiciones de unión externa izquierda y dónde
- ¿Hay alguna diferencia técnica? entre estas consultas?
- ¿Hay algo en el estándar SQL que explica las diferentes de registros de las consultas?
Dado el escenario simplificado:
--Table: Parent Columns: ID, Name, Description
--Table: Child Columns: ID, ParentID, Name, Description
--Query 1
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM Parent p
LEFT OUTER JOIN Child c ON (p.ID = c.ParentID)
WHERE c.ID IS NULL OR c.Description = 'FilterCondition'
--Query 2
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM Parent p
LEFT OUTER JOIN Child c
ON (p.ID = c.ParentID AND c.Description = 'FilterCondition')
que asumió las consultas volverían los mismos conjuntos de resultados y me sorprendió cuando no lo hicieron. Estoy usando MS SQL2005 y en las consultas reales, la consulta 1 arrojó ~ 700 filas y la consulta 2 devolvió ~ 1100 filas y no pude detectar un patrón en el que se devolvieron las filas y qué filas se excluyeron. Todavía había muchas filas en la consulta 1 con filas secundarias con datos y datos NULL. Prefiero el estilo de la consulta 2 (y creo que es más óptimo), pero pensé que las consultas arrojarían los mismos resultados.
Editar/resumen:
Hubo algunas grandes respuestas proporcionadas aquí. Me costó mucho elegir a quién otorgar la respuesta. Decidí ir con mdma ya que era la primera respuesta y una de las más claras. Sobre la base de las respuestas suministradas, aquí está mi resumen:
resultados posibles:
- A: Padres que no tienen hijos
- B: Los padres con niños
- | -> B1: Padres niños donde no coincide con el niño el filtro
- \ -> B2: padres con hijos donde 1 o más coinciden con el filtro
resultados de la consulta:
- de consulta 1 vuelve (A, B2)
- Consulta 2 devuelve (A, B1, B2)
de consulta 2 siempre devuelve un padre debido la izquierda se une En la consulta 1, la cláusula WHERE se realiza después de la combinación left, por lo que se excluyen los padres con hijos donde ninguno de los hijos coincide con el filtro (caso B1).
Nota: sólo la información de los padres se devuelve en caso B1, B2 y en caso únicamente se devuelve la información de padre/hijo que coincida con el filtro.
HLGEM proporciona un buen enlace:
http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN
Gracias. Entiendo la diferencia en términos de rendimiento, pero tengo más curiosidad sobre los diferentes resultados. – Ryan
@Ryan - No se trata de rendimiento. El lugar donde se aplica el filtrado puede marcar la diferencia en términos del conjunto de resultados adecuado. – Thomas
Entendido. Gracias. – Ryan