PostgreSQL tiene un tipo especial de unión llamado SELF JOIN que se usa para unir una tabla consigo misma. Es útil cuando se compara la columna de filas dentro de la misma tabla. Como en PostgreSQL no se permite usar el mismo nombre de tabla para la comparación, usamos alias para establecer diferentes nombres de la misma tabla durante la autounión.
También es importante tener en cuenta que no existe una palabra clave como SELF JOIN , pero se logra con la ayuda de LEFT JOIN, RIGHT JOIN o INNER JOIN usando alias.
Syntax: SELECT column_list FROM table_name T1 INNER JOIN table_name T2 ON join_predicate; or, Syntax: SELECT column_list FROM table_name T1 LEFT JOIN table_name T2 ON join_predicate; or, Syntax: SELECT column_list FROM table_name T1 RIGHT JOIN Table_name T2 ON join_predicate;
Configuremos una base de datos y una tabla de muestra para la demostración de la unión automática.
- Cree una base de datos llamada «empresa» con el siguiente comando:
CREATE DATABASE company;
- Agregue una tabla de «empleado» para mostrar la jerarquía de la empresa en la base de datos usando el siguiente comando:
CREATE TABLE employee ( employee_id INT PRIMARY KEY, first_name VARCHAR (255) NOT NULL, last_name VARCHAR (255) NOT NULL, manager_id INT, FOREIGN KEY (manager_id) REFERENCES employee (employee_id) ON DELETE CASCADE );
- Ahora agregue algunos datos de empleados a la tabla usando el siguiente comando:
INSERT INTO employee ( employee_id, first_name, last_name, manager_id ) VALUES (1, 'Sandeep', 'Jain', NULL), (2, 'Abhishek ', 'Kelenia', 1), (3, 'Harsh', 'Aggarwal', 1), (4, 'Raju', 'Kumar', 2), (5, 'Nikhil', 'Aggarwal', 2), (6, 'Anshul', 'Aggarwal', 2), (7, 'Virat', 'Kohli', 3), (8, 'Rohit', 'Sharma', 3);
El valor en la columna manager_id representa al gerente sénior al que se reporta el empleado. Si es Nulo, no informa a nadie.
La jerarquía general se parece a la siguiente imagen:Ahora que tenemos nuestra base de datos lista, veamos algunos ejemplos de SELF JOIN.
Ejemplo 1:
Aquí vamos a consultar los datos de quién reporta a quién usando la misma tabla de “empleados” dos veces.SELECT e.first_name || ' ' || e.last_name employee, m .first_name || ' ' || m .last_name manager FROM employee e INNER JOIN employee m ON m .employee_id = e.manager_id ORDER BY manager;
Producción:Ejemplo 2:
si recuerda nuestra base de datos de alquiler de DVD de muestra utilizada en artículos anteriores, que se explica aquí y se puede descargar desde aquí , realizaremos la unión automática en la tabla de películas de esa base de datos. Aquí buscaremos todos los pares de películas que tengan el mismo tiempo de ejecución.SELECT f1.title, f2.title, f1. length FROM film f1 INNER JOIN film f2 ON f1.film_id <> f2.film_id AND f1. length = f2. length;
Producción:
Publicación traducida automáticamente
Artículo escrito por RajuKumar19 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA