ejemplos all sql

sql - all - ¿Alguien usa uniones externas derechas?



sql union distinct (9)

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

Si desea devolver todas las filas de la tabla de la izquierda, incluso si no hay coincidencias en la tabla correcta ... usa 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, usa la combinación correcta.

Curiosamente, rara vez utilizo combinaciones correctas.

Uso INNER JOIN y LEFT OUTER JOINs todo el tiempo. Sin embargo, nunca parece necesitar RIGHT OUTER JOINs, nunca.

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 Right?


En raras ocasiones, como se indicó, generalmente puede reordenar y usar 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.


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.


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


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


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.


Solo uso a la izquierda, pero déjame decirte que son realmente los mismos dependiendo de cómo pidas 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.

Es decir

Tengo lo principal aquí

Necesito más basura

Más basura Juntas externas correctas Material principal

Prefiero hacer cosas principales que basura ... Así que lo de afuera funciona para mí.

Entonces, lo que sea que flote tu bote.


Usualmente usas DERECHO EXTERIOR para encontrar elementos huérfanos en otras tablas.


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 mascotas opcionalmente y estas mascotas 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 que enumere a todas las personas independientemente de si poseen o no una mascota e información sobre las mascotas que poseen que también tengan accesorios.

Esto no funciona (Excluye a 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;

Esto 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;

Esto sí funciona (pero la sintaxis se entiende mucho menos comúnmente ya que requiere dos cláusulas ON sucesivas 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;

En general, es más fácil usar una 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 se determina a evitar esto, otra opción sería introducir una tabla derivada que se pueda unir 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