2009-03-27 10 views
35

Uso INNER JOIN y LEFT OUTER JOINs todo el tiempo. Sin embargo, nunca parece necesitar RIGHT OUTER JOINs, nunca.¿Alguien usa articulaciones externas derechas?

He visto un montón de desagradable SQL autogenerado que usa combinaciones correctas, pero para mí, ese código es imposible de entender. Siempre necesito reescribirlo usando uniones internas y uniones izquierdas para hacer cabezas o colas.

¿Alguien realmente escribe consultas utilizando combinaciones de la derecha?

+0

Relacionados: http: // s tackoverflow.com/questions/436345/when-or-why-would-you-use-a-right-outer-join-instead-of-left – Thilo

Respuesta

25

Depende de qué lado de la unión coloque cada tabla.

Si desea devolver todas las filas de la tabla de la izquierda, incluso si no hay coincidencias en la tabla de la derecha ... utiliza la combinación de la izquierda.

Si desea devolver todas las filas de la tabla correcta, incluso si no hay coincidencias en la tabla de la izquierda, use la combinación derecha.

Es curioso que rara vez utilicé combinaciones correctas.

+11

Siempre me resulta más lógico comenzar con la tabla que tiene todos los elementos no huérfanos, por lo que siempre termino usando LEFT JOIN también. Me pregunto si es algo cultural. –

+5

+1, las combinaciones externas izquierda y derecha son exactamente lo mismo solo lo contrario. –

+1

@MatthieuF: Tal vez sea cultural. Usar la combinación correcta se siente como hacer algo de manera opuesta. Viene sin pensar, al menos para mí, para organizar siempre mis uniones de forma tal que (si es necesario) la izquierda se una a la situación. No sé por qué? :-) – Petros

6

No, no lo hago por la sencilla razón de que puedo lograr todo con combinaciones internas o izquierdas.

9

Normalmente usa UNIONES EXTERNAS DERECHO para buscar elementos huérfanos en otras tablas.

+0

¿Puede proporcionar más detalles? – Shabbyrobe

+0

Revisa este artículo. http://www.devx.com/dbzone/Article/17403/0/page/5 –

+17

Me parece que esta respuesta hace que las uniones de la derecha suenen especiales cuando no lo son. Las uniones externas izquierda y derecha son imágenes especulares entre sí, ambas útiles para encontrar objetos huérfanos. La elección de cuál usar se basa simplemente en la tabla de la que desea que aparezcan todas las filas, incluso si no hay coincidencias. –

1

Nuestra práctica estándar aquí es escribir todo en términos de uniones IZQUIERDAS si es posible. Ocasionalmente hemos utilizado FULL OUTER JOINs si lo hemos necesitado, pero nunca RIGHT JOINs.

2

La única vez que uso una combinación externa derecha es cuando estoy trabajando en una consulta existente y necesito cambiarla (normalmente desde un interior). Podría revertir la combinación y hacerla a la izquierda y probablemente estar bien, pero trato de reducir la cantidad de cosas que cambio cuando modifico el código.

2

Solo uso a la izquierda, pero déjenme decir que son realmente los mismos dependiendo de cómo se piden las cosas. Trabajé con algunas personas que solo usaban correctamente, porque creaban consultas desde adentro y les gustaba mantener sus elementos principales en la parte inferior, así que en sus mentes tenía sentido usar solo la derecha.

I.e.

Tienes lo principal aquí

necesita más basura

más basura combinación externa derecha principal materia

prefiero hacer cosas principal, entonces no deseado ... obras exteriores Así izquierda para mí.

Así que lo que sea que flote su bote.

1

Puede lograr lo mismo usando uniones IZQUIERDA o DERECHA. En general, la mayoría de la gente piensa en términos de una unión IZQUIERDA probablemente porque leemos de izquierda a derecha. Realmente se trata de ser consistente. Su equipo debe enfocarse en usar uniones IZQUIERDA o DERECHA, no ambas, ya que son esencialmente las mismas, escritas de manera diferente.

1

En raras ocasiones, como se ha indicado, generalmente puede reordenar y utilizar una combinación izquierda. También, naturalmente, ordeno ordenar los datos, de modo que las uniones izquierdas funcionan para obtener los datos que necesito. Creo que lo mismo puede decirse de las uniones externas y cruzadas, la mayoría de las personas tienden a mantenerse alejadas de ellos.

24

Para dar un ejemplo donde un RIGHT JOIN puede ser útil.

Supongamos que hay tres tablas para personas, mascotas y accesorios para mascotas. Las personas pueden tener opcionalmente mascotas y estos animales pueden tener opcionalmente accesorios

CREATE TABLE Persons 
    (
    PersonName VARCHAR(10) PRIMARY KEY 
); 

INSERT INTO Persons 
VALUES  ('Alice'), 
      ('Bob'), 
      ('Charles'); 

CREATE TABLE Pets 
    (
    PetName VARCHAR(10) PRIMARY KEY, 
    PersonName VARCHAR(10) 
); 

INSERT INTO Pets 
VALUES  ('Rover', 
      'Alice'), 
      ('Lassie', 
      'Alice'), 
      ('Fifi', 
      'Charles'); 

CREATE TABLE PetAccessories 
    (
    AccessoryName VARCHAR(10) PRIMARY KEY, 
    PetName  VARCHAR(10) 
); 

INSERT INTO PetAccessories 
VALUES  ('Ball', 'Rover'), 
      ('Bone', 'Rover'), 
      ('Mouse','Fifi'); 

Si el requisito es obtener un resultado de la lista todas las personas, independientemente de si son o no tener una mascota y la información acerca de las mascotas que reconocer que también tienen accesorios .

Este no funciona (Excluye Bob)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
     ON P.PersonName = Pt.PersonName 
     INNER JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName; 

Este no funciona (Incluye Lassie)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
     ON P.PersonName = Pt.PersonName 
     LEFT JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName; 

Este hace trabajar (pero la sintaxis es mucho menos comúnmente entendido ya que requiere dos cláusulas ON en sucesión para lograr el orden de unión lógica deseado)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
        INNER JOIN PetAccessories Pa 
        ON Pt.PetName = Pa.PetName 
     ON P.PersonName = Pt.PersonName; 

Con todo, probablemente, más fácil de usar un RIGHT JOIN

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Pets Pt 
     JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName 
     RIGHT JOIN Persons P 
     ON P.PersonName = Pt.PersonName; 

Aunque si decidida a evitar esta otra opción sería introducir una tabla derivada que se puede dejar unida a

SELECT P.PersonName, 
     T.PetName, 
     T.AccessoryName 
FROM Persons P 
     LEFT JOIN (SELECT Pt.PetName, 
         Pa.AccessoryName, 
         Pt.PersonName 
        FROM Pets Pt 
         JOIN PetAccessories Pa 
          ON Pt.PetName = Pa.PetName) T 
     ON T.PersonName = P.PersonName; 

Fiddles SQL: MySQL, PostgreSQL, SQL Server

+0

Si no entiende por qué se excluyó al pobre Bob, esto me ayudó: http: // weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx – Luke

+0

@Luke - ¡Coincidente de que ambos usamos un ejemplo de "mascotas"! –

Cuestiones relacionadas