jueves, 24 de marzo de 2016

Join en Tablas con PostgreSQL


Existen dos tipos de combinaciones

Combinaciones internas de tablas: Donde cada registro de la tabla A se combina con otro de la tabla B que cumpla las condiciones.

Inner Join
       
    select * from empleado as a, departamento as b where a.departamento_id = b.id;

    select * from empleado as a inner join departamento as b on a.departamento_id = b.id;
    select * from empleado as a join departamento as b on a.departamento_id = b.id;
Para PostgreSQL utilizar inner join o join se refiere a la misma instrucción, en ambos casos se hacer referencia a una unión interna donde cada uno de los registros debe quedar asociado a un registros de la otra tabla.

En lugar de utilizar ON también se puede utilizar USING para especificar el campo con el cual se desea realizar la igualdad cuando los nombre de los campos son iguales en ambas tablas.


    select * from departamento join oficina using (id);
    select * from departamento join oficina using (nombre);

En ambos casos se obtendrán diferentes resultados según los valores almacenados en cada tabla.

Usign también permite realizar la búsqueda por más de un campo, cuando más de un campo de la tabla tiene el mismo nombre.


    select * from departamento join oficina using (id, nombre);

Natural Join


    select * from departamento natural join oficina;

Cuando tenemos el mismo nombre de campo para diferentes tablas, podemos usar el o los campos con el mismo nombre para unir diferentes tablas. Esta unión es un tipo especial de inner join. Esta operación iguala todas las columnas que tienen el mismo nombre en ambas tablas presentando como resultados solo los registros que tienen correspondencia.

Combinaciones externas de tablas: Donde se recuperan todos los registros de una tabla tengan o no correspondencia en la otra tabla.

Outer Join por la Izquierda


    select * from empleado as a left join departamento as b on a.departamento_id = b.id; 
    select * from empleado as e left outer join departamento as d on e.departamento_id = d.id;

Esta consulta recuperará todos los registros de la tabla izquierda (empleado) tengan o no correspondencia en la tabla derecha (departamento).

Outer Join por la Derecha


    select * from empleado as a right join departamento as b on a.departamento_id = b.id; 
    select * from empleado as e right outer join departamento as d on e.departamento_id = d.id;

Esta consulta recuperará todos los registros de la tabla derecha (departamento) tengan o no correspondencia en la tabla izquierda (empleado).

Outer Join Full


    select * from empleado as e full join departamento as d on e.departamento_id = d.id;
    select * from empleado as a full outer join departamento as b on e.departamento_id = b.id;
Esta consulta recuperará todos los registros de la tabla derecha (departamento) e izquierda (empleado) tengan o no correspondencia en la tabla izquierda (empleado) y derecha (departamento) respectivamente.

En los tres casos anteriores los registros que no tengan correspondencia completarán los campos con el valor null.

Cross Join
 

    select * from empleado, departamento; 
    select * from empleado cross join departamento;

La más simple unión, es una unión de cruce, esto crea un conjunto resultado de todas las posibles combinaciones de las filas entre ambas tablas.

Existen otros tipos de combinaciones que corresponden a modificaciones de las consultas anteriores, pero que pueden ser de gran ayuda en algunos caso particulares.
 

    select * from empleado as e left join departamento as d on e.departamento_id = d.id
where d.id is null;

Esta consulta presenta todos los registros de la tabla izquierda (empleado) que no se encuentran asociados a los registros de la tabla derecha (departamento). 

    select * from empleado as e right join departamento as d on e.departamento_id = d.id
where e.id is null;

Esta consulta presenta todos los registros de la tabla derecha (departamento) que no se encuentran asociadas a los registros de la tabla izquierda (empleado).

    select * from empleado as e full join departamento as d on e.departamento_id = d.id
where e.id is null or d.id is null;

Esta consulta presenta todos los registros de la tabla izquierda (empleado) y de la tabla derecha (departamento) que no se encuentran asociados a la otra tabla.


Referecias:

https://www.imaginanet.com/blog/diferencias-entre-join-left-join-y-right-join.html
http://donnierock.com/2014/03/04/diferencia-entre-inner-join-left-join-y-right-join-sql/
http://www.postgresqlforbeginners.com/2010/11/sql-inner-cross-and-self-joins.html

"Gracias, por compartir tus conocimientos"

1 comentario: