2012-06-22 23 views
7

Estoy ocupado convirtiendo una consulta utilizando la sintaxis de estilo antiguo a la nueva sintaxis de unión. La esencia de mi consulta es la siguiente:SQL Inner Join. Condición ON frente a la cláusula WHERE

Pregunta Original

SELECT i.* 
FROM 
    InterestRunDailySum i, 
    InterestRunDetail ird, 
    InterestPayments p 
WHERE 
    p.IntrPayCode = 187 
    AND i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode 
    AND ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode 

Nueva consulta

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.IntRunCode = p.IntRunCode) 
    WHERE 
    p.IntrPayCode = 187 

En este ejemplo, "búsqueda original" devuelve 46 filas, donde "Nueva consulta" rendimientos a lo largo 800

¿Alguien me puede explicar la diferencia? Hubiera supuesto que estas consultas son idénticas.

Respuesta

17

El problema está en su unión al InterestRunDetail. Se está uniendo al IntRunCode dos veces.

La consulta correcta debe ser:

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode) 
    WHERE 
    p.IntrPayCode = 187 
+1

Gracias Kevin, me siento como un tonto por no ver eso! – Russell

+2

Nos sucede a todos nosotros. :-) –

4

La "nueva consulta" es el que es compatible con el actual estándar ANSI SQL para la combinación.

Además, me parece consulta # 2 tanto limpiador:

  • que está casi obligado a pensar y especificar el condición de unión (s) entre dos tablas - no por casualidad tiene cartesiano productos en su consulta. Si aparece una lista de diez tablas, pero solo seis condiciones de suscripción en su cláusula WHERE, obtendrá mucho más datos de de los esperados.

  • su cláusula WHERE no está lleno de condiciones de combinación y por lo tanto es más limpio, menos complicado, más fácil de leer y entender

  • la tipo de su JOIN (si INNER JOIN, LEFT OUTER JOIN, CROSS JOIN) es típicamente mucho más fácil de ver, ya que lo deletreas. Con la sintaxis "viejo estilo", la diferencia entre los tipos de combinación es bastante difícil de ver, enterrado en algún lugar de su gran cantidad de WHERE criterios .....

Funcionalmente, los dos son idénticos - # 1 podría ser desaprobado tarde o temprano por algunos motores de búsqueda.

Véase también excelente post Bad Habits to Kick - using old-style JOIN syntax el blog de Aaron Bertrand para obtener más información - y mientras estás en ello - Leer todos "malos hábitos para dar inicio a" mensajes - todo muy mucho la pena!

+1

Buena respuesta, pero sus consultas no son idénticas, parece que fue solo un error ;-) –

Cuestiones relacionadas