none
Consulta Unión de Tablas (Inner Join) RRS feed

  • Pregunta

  • Buen día estimados gurus de SQL Server. Quisiera me pudieran despejar una duda que tengo ya desde hace algunas semanas. Verán he visto que muchos postulantes a un puesto de trabajo en sus exámenes de conocimiento no usan Inner Join para unir tablas, muy por el contrario hacen lo siguiente:

    SELECT COL1,COL2,COL3,COL4,COL5 FROM TABLA A, TABLA B, TABLA C, TABLA D, TABLA E
    ON A.IDTABLA = B.IDTABLA
    .
    .
    .
    .
    ON A.IDTABLA = E.IDTABLA
    Para mi no es correcto hacer ello, pero no soy un gran conocedor sobre base de datos. Por ello quisiera que pudieran despejarme esta duda. Gracias de antemano

    jueves, 10 de septiembre de 2015 14:08

Respuestas

  • No, no es correcto.

    Es más. SQL Server devolverá un error de sintaxis.

    Lo que si puedes es incluir las tablas separadas por comas en el FROM y establecer las relaciones en el WHERE:

    SELECT COL1,COL2,COL3,COL4,COL5 FROM TABLA A, TABLA B, TABLA C, TABLA D, TABLA E
    WHERE A.IDTABLA = B.IDTABLA .... AND A.IDTABLA=E.IDTABLA


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Carlos Sk jueves, 10 de septiembre de 2015 14:36
    jueves, 10 de septiembre de 2015 14:15
  • Carlos, es un tema más de convención de sintaxis, en la vieja sintaxis SQL Ansi 92, se usaba el formato

    select ...

    from tabla1 t, tabla2 t2 , tabla3 t3

    where t.campo=t2.campo and t2.campo2=t3.campo2

    el resultado era que where acogía tanto los valores  de filtro como los de unión entre tablas,

    para especificar left joins se usaba

    t.campo=*t2.campo y para right t.campo*=t2.campo, eso para SQL Server en Oracle se ponía (+) detrás del nombre de la tabla opcional... como ves muy poco claro

    Es a partir de una revisión de ansi que no recuerdo exactamente cuando se cambia esta sintaxis, y después los motores lo acogen. Ahora mismo la sintaxis considerada correcta es

    select xxxxx

    from tabla t1 (left|right|inner|outer) join tabla2 t2 on t1.campo=t2.campo

    Espero que eso te aclare mas los conceptos


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Carlos Sk jueves, 10 de septiembre de 2015 14:36
    jueves, 10 de septiembre de 2015 14:29
    Moderador

Todas las respuestas

  • No, no es correcto.

    Es más. SQL Server devolverá un error de sintaxis.

    Lo que si puedes es incluir las tablas separadas por comas en el FROM y establecer las relaciones en el WHERE:

    SELECT COL1,COL2,COL3,COL4,COL5 FROM TABLA A, TABLA B, TABLA C, TABLA D, TABLA E
    WHERE A.IDTABLA = B.IDTABLA .... AND A.IDTABLA=E.IDTABLA


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Carlos Sk jueves, 10 de septiembre de 2015 14:36
    jueves, 10 de septiembre de 2015 14:15
  • Ya veo, pero que tan óptimo es establecer las relaciones en el Where? es decir que tipo de unión se formará? me traerá los que no tenga información nula en el caso del Inner Join o me traerá nulos y no nulos como es el caso del Left Join?
    jueves, 10 de septiembre de 2015 14:20
  • Carlos, es un tema más de convención de sintaxis, en la vieja sintaxis SQL Ansi 92, se usaba el formato

    select ...

    from tabla1 t, tabla2 t2 , tabla3 t3

    where t.campo=t2.campo and t2.campo2=t3.campo2

    el resultado era que where acogía tanto los valores  de filtro como los de unión entre tablas,

    para especificar left joins se usaba

    t.campo=*t2.campo y para right t.campo*=t2.campo, eso para SQL Server en Oracle se ponía (+) detrás del nombre de la tabla opcional... como ves muy poco claro

    Es a partir de una revisión de ansi que no recuerdo exactamente cuando se cambia esta sintaxis, y después los motores lo acogen. Ahora mismo la sintaxis considerada correcta es

    select xxxxx

    from tabla t1 (left|right|inner|outer) join tabla2 t2 on t1.campo=t2.campo

    Espero que eso te aclare mas los conceptos


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta Carlos Sk jueves, 10 de septiembre de 2015 14:36
    jueves, 10 de septiembre de 2015 14:29
    Moderador
  • Al establecer todas las tablas en el FROM, SQL Server lo que hace es un producto cartesiano de todos los registros de las tablas.

    A continuación con la WHERE filtras los registros que te interesan (los que tienen los valores coincidentes en los campos clave).

    Así que si estableces todas las condiciones de las JOIN en el WHERE el resultado es el mismo que el de utilizar INNER JOIN.

    En cuanto al rendimiento, en principio es el mismo. Aunque yo siempre prefiero utilizar INNER JOIN porque la consulta queda mucho más legible.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 10 de septiembre de 2015 14:32
  • Perfecto Miguel, muchas gracias por la aclaración. Me quedó todo claro.
    jueves, 10 de septiembre de 2015 14:36
  • Un placer!

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 10 de septiembre de 2015 14:40
    Moderador