PostgreSQL - UNIONES

El PostgreSQL JoinsLa cláusula se utiliza para combinar registros de dos o más tablas en una base de datos. Un JOIN es un medio para combinar campos de dos tablas utilizando valores comunes a cada uno.

Los tipos de unión en PostgreSQL son:

  • LA CRUZ SE UNE
  • El INNER JOIN
  • LA UNIÓN EXTERIOR IZQUIERDA
  • LA UNIÓN EXTERIOR CORRECTA
  • La unión exterior completa

Antes de continuar, consideremos dos tablas, EMPRESA y DEPARTAMENTO. Ya hemos visto instrucciones INSERT para completar la tabla EMPRESA. Así que asumamos la lista de registros disponibles en la tabla EMPRESA -

id | name  | age | address   | salary | join_date
----+-------+-----+-----------+--------+-----------
  1 | Paul  |  32 | California|  20000 | 2001-07-13
  3 | Teddy |  23 | Norway    |  20000 |
  4 | Mark  |  25 | Rich-Mond |  65000 | 2007-12-13
  5 | David |  27 | Texas     |  85000 | 2007-12-13
  2 | Allen |  25 | Texas     |        | 2007-12-13
  8 | Paul  |  24 | Houston   |  20000 | 2005-07-13
  9 | James |  44 | Norway    |   5000 | 2005-07-13
 10 | James |  45 | Texas     |   5000 | 2005-07-13

Otra tabla es DEPARTAMENTO, tiene la siguiente definición:

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

Aquí está la lista de declaraciones INSERT para completar la tabla DEPARTMENT:

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

Finalmente, tenemos la siguiente lista de registros disponibles en la tabla DEPARTMENT:

id | dept        | emp_id
----+-------------+--------
  1 | IT Billing  |  1
  2 | Engineering |  2
  3 | Finance     |  7

LA CRUZ SE UNE

A CROSS JOIN hace coincidir cada fila de la primera tabla con cada fila de la segunda tabla. Si las tablas de entrada tienen columnas xey, respectivamente, la tabla resultante tendrá columnas x + y. Debido a que las CROSS JOIN tienen el potencial de generar tablas extremadamente grandes, se debe tener cuidado de usarlas solo cuando sea apropiado.

La siguiente es la sintaxis de CROSS JOIN:

SELECT ... FROM table1 CROSS JOIN table2 ...

Según las tablas anteriores, podemos escribir un CROSS JOIN de la siguiente manera:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

La consulta dada anteriormente producirá el siguiente resultado:

emp_id| name  |  dept
------|-------|--------------
    1 | Paul  | IT Billing
    1 | Teddy | IT Billing
    1 | Mark  | IT Billing
    1 | David | IT Billing
    1 | Allen | IT Billing
    1 | Paul  | IT Billing
    1 | James | IT Billing
    1 | James | IT Billing
    2 | Paul  | Engineering
    2 | Teddy | Engineering
    2 | Mark  | Engineering
    2 | David | Engineering
    2 | Allen | Engineering
    2 | Paul  | Engineering
    2 | James | Engineering
    2 | James | Engineering
    7 | Paul  | Finance
    7 | Teddy | Finance
    7 | Mark  | Finance
    7 | David | Finance
    7 | Allen | Finance
    7 | Paul  | Finance
    7 | James | Finance
    7 | James | Finance

El INNER JOIN

Una INNER JOIN crea una nueva tabla de resultados combinando valores de columna de dos tablas (table1 y table2) según el predicado de unión. La consulta compara cada fila de table1 con cada fila de table2 para encontrar todos los pares de filas que satisfacen el predicado de unión. Cuando se satisface el predicado de unión, los valores de columna para cada par coincidente de filas de table1 y table2 se combinan en una fila de resultados.

Una INNER JOIN es el tipo más común de unión y es el tipo de unión predeterminado. Puede utilizar la palabra clave INNER opcionalmente.

La siguiente es la sintaxis de INNER JOIN:

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;

Según las tablas anteriores, podemos escribir una INNER JOIN de la siguiente manera:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

La consulta dada anteriormente producirá el siguiente resultado:

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering

LA UNIÓN EXTERIOR IZQUIERDA

OUTER JOIN es una extensión de INNER JOIN. El estándar SQL define tres tipos de OUTER JOINs: LEFT, RIGHT y FULL y PostgreSQL admite todos estos.

En el caso de LEFT OUTER JOIN, primero se realiza una combinación interna. Luego, para cada fila de la tabla T1 que no satisfaga la condición de unión con ninguna fila de la tabla T2, se agrega una fila unida con valores nulos en las columnas de T2. Por lo tanto, la tabla unida siempre tiene al menos una fila para cada fila en T1.

La siguiente es la sintaxis de LEFT OUTER JOIN -

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

Según las tablas anteriores, podemos escribir una combinación interna de la siguiente manera:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La consulta dada anteriormente producirá el siguiente resultado:

emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |

LA UNIÓN EXTERIOR CORRECTA

Primero, se realiza una combinación interna. Luego, para cada fila de la tabla T2 que no satisfaga la condición de unión con ninguna fila de la tabla T1, se agrega una fila unida con valores nulos en las columnas de T1. Esta es la inversa de una combinación de izquierda; la tabla de resultados siempre tendrá una fila para cada fila en T2.

La siguiente es la sintaxis de RIGHT OUTER JOIN -

SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...

Según las tablas anteriores, podemos escribir una combinación interna de la siguiente manera:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La consulta dada anteriormente producirá el siguiente resultado:

emp_id | name  | dept
--------+-------+--------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance

La unión exterior completa

Primero, se realiza una combinación interna. Luego, para cada fila de la tabla T1 que no satisfaga la condición de unión con ninguna fila de la tabla T2, se agrega una fila unida con valores nulos en las columnas de T2. Además, para cada fila de T2 que no satisfaga la condición de unión con ninguna fila en T1, se agrega una fila unida con valores nulos en las columnas de T1.

La siguiente es la sintaxis de FULL OUTER JOIN -

SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

Según las tablas anteriores, podemos escribir una combinación interna de la siguiente manera:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La consulta dada anteriormente producirá el siguiente resultado:

emp_id | name  | dept
--------+-------+---------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |