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