2009-03-10 17 views
9

Tengo la petición siguiente:¿Debo usar la palabra clave JOIN de sql para combinaciones complejas en varias tablas?

select * 
    from tbA A, tbB B, tbC C, tbD D 
where 
    A.ID=B.ID and B.ID2= C.ID2 and A.ID=D.ID and C.ID3=D.ID3 and B.ID4=D.ID4 
and 
    A.Foo='Foo' 

He oído varias veces que esta sintaxis de la combinación se deprecia, y que debería utilizar la palabra clave 'JOIN' en su lugar.

¿Cómo puedo hacer eso en una combinación tan complicada (varias tablas unidas en varias columnas que pertenecen a diferentes tablas)? ¿Crees que esta mejor práctica todavía se aplica aquí?

+0

Lo bueno de usar el formato ANSI es que la lógica de unión se separa de su lógica de filtrado. Hace que sea muy claro ver cómo se relacionan las tablas de un vistazo. – Barry

+0

Sí, está en desuso.Y sí, deberías limpiar tu sql. – NotMe

+0

@Chris: bueno, parece que el uso de esta sintaxis no está en desuso, mientras que el uso de * (para hacer uniones a la izquierda) es (se detalla en otra respuesta). re el SQL, lo acabo de escribir como un ejemplo – Brann

Respuesta

10

Es una cuestión de gusto, pero me gusta más la palabra clave JOIN. Hace la lógica más clara y es más consistente con la sintaxis LEFT OUTER JOIN que la acompaña. Tenga en cuenta que también puede usar INNER JOIN, que es sinónimo de JOIN.

La sintaxis es

a JOIN b 
    ON expression relating b to all of the tables before 

b puede ser una unión en sí. Para combinaciones internas no importa, pero para exterior se puede controlar el orden de las juntas de esta manera:

select * from 
    a left join 
     d join c 
     on d.i = c.i 
    on a.k = d.k 

Aquí a se unieron-izquierda a la unión interna entre D y C.

Aquí es su consulta:

select * 
    from tbA A 
    join tbB B on A.ID = B.ID 
    join tbC C on B.ID2 = C.ID2 
    join tbD D on A.ID = D.ID and C.ID3 = D.ID3 and B.ID4 = D.ID4 
where 
    A.Foo='Foo' 
5

me parece unirse a la sintaxis mucho más fácil de entender

select * 
from tbA A 
inner join tbB B on a.id = b.id 
inner join tbC C on b.id2 = c.id2 
inner join tbD D on a.id = d.id and c.id3 = d.id3 and b.id4 = d.id4 
where A.Foo='Foo' 

ahora se puede ver claramente cómo se unen entre sí los datos y que no es un campo muy complicado unirse por completo.

Por cierto, el diseño de la base de datos en su ejemplo huele a falta de normalización. Por lo general, debe tener una tabla uniéndose a muchas (una unión b en a.bid = b.bid join c en a.cid = c.cid) o una cadena (a join b en a.bid = b.bid join c en b.cid = c.cid).

EDITAR. Se agregó la palabra clave opcional INNER que no cambia el resultado, pero lo hace más claro.

+0

¿repitió 'a.id = b.id' dos veces a propósito? – Brann

+0

Eso debería ser a.id = d.id3. –

+0

en realidad debería ser a.id = d.id :) Publicación corregida. Por cierto, este simple problema con la nomenclatura muestra claramente por qué el diseño no es correcto. – user76035

2
SELECT * 
FROM tba AS a 
    JOIN tbb AS b ON a.id = b.id 
    JOIN tbc AS c ON b.id2 = c.id2 
    JOIN tbd AS d ON a.id = d.id AND c.id3 = d.id3 AND b.id4 = d.id4 
WHERE 
    a.foo = 'Foo' 

Aunque estoy teniendo dificultades para imaginar cualquier necesidad de eso. Desnudo para dar un ejemplo, o eh nombres de tabla más descriptivos?

2

JOIN sintaxis es más legible (aunque yo personalmente prefiero WHERE sintaxis en casos sencillos), y, lo que es más importante, puede manejar INNER y OUTER se une de una manera más clara.

WHERE no está obsoleto y probablemente nunca lo será.

Está en desuso solo en el sentido de que las diferentes soluciones OUTER JOIN (como (*) y (+)) están en desuso.

No hay nada que no pueda hacer con JOIN que puede hacer con WHERE, pero no viceversa.

+0

De hecho. Ahora recuerdo haber visto este mensaje al usar * en una combinación – Brann

Cuestiones relacionadas