sql >> Base de Datos >  >> RDS >> Database

Unir 3 tablas en SQL

En SQL, puede unir tres tablas o más agregando otra unión después de la primera.

También puede ejecutar combinaciones anidadas especificando una combinación como condición de combinación para otra.

Sintaxis

La forma más común de unir tres mesas es algo así:

SELECT *
FROM Table1 
INNER JOIN Table2
    ON Condition
INNER JOIN Table3
    ON Condition;

Esto utiliza una unión interna, pero puede especificar el tipo de unión que desee como con cualquier otra unión. También puede combinar tipos de unión si es necesario (ejemplo a continuación).

También puede utilizar combinaciones anidadas especificando una combinación como condición de combinación para otra combinación. Así:

SELECT *
FROM Table1 
JOIN (Table2
            JOIN Table3
            ON Condition)
ON Condition;

Datos de muestra:las 3 tablas

Supongamos que tenemos las siguientes tres tablas.

Los Customers tabla:

+--------------+----------------+----------------+----------------+
| CustomerId   | CustomerName   | PostalCityId   | PhoneNumber    |
|--------------+----------------+----------------+----------------|
| 1            | Homer McKenzie | 19586          | (308) 555-0100 |
| 2            | Marge Pratt    | 33475          | (406) 555-0100 |
| 3            | Vlad Bernanke  | NULL           | (480) 555-0100 |
| 4            | Bart Pitt      | 21692          | (316) 555-0100 |
| 5            | Lisa McQueen   | 12748          | (212) 555-0100 |
| 6            | Steve Simpson  | 17054          | (701) 555-0100 |
| 7            | Vinn Allen     | 12152          | (423) 555-0100 |
| 8            | Veejay Smith   | 3673           | (303) 555-0100 |
| 9            | Kasey Chin     | 23805          | (201) 555-0100 |
| 10           | Borat Lee      | 37403          | (701) 555-0100 |
+--------------+----------------+----------------+----------------+
(10 rows affected)

Las Cities tabla:

+----------+----------------+-------------------+--------------+
| CityId   | CityName       | StateProvinceId   | Population   |
|----------+----------------+-------------------+--------------|
| 3673     | Bow Mar        | 6                 | 866          |
| 12152    | Frankewing     | 44                | NULL         |
| 12748    | Gasport        | 33                | 1248         |
| 21692    | Medicine Lodge | 17                | 2009         |
| 26483    | Peeples Valley | 3                 | 428          |
| 33475    | Sylvanite      | 27                | 103          |
| 17054    | Jessie         | 35                | 25           |
| 19586    | Lisco          | 28                | NULL         |
| 37403    | Wimbledon      | 35                | 216          |
+----------+----------------+-------------------+--------------+
(9 rows affected)

Los StateProvinces tabla:

+-------------------+---------------------+---------------------+-------------+--------------+
| StateProvinceId   | StateProvinceCode   | StateProvinceName   | CountryId   | Population   |
|-------------------+---------------------+---------------------+-------------+--------------|
| 3                 | AZ                  | Arizona             | 230         | 6891688      |
| 6                 | CO                  | Colorado            | 230         | 5698265      |
| 17                | KS                  | Kansas              | 230         | 2893957      |
| 28                | NE                  | Nebraska            | 230         | 1943256      |
| 31                | NJ                  | New Jersey          | 230         | 8899339      |
| 33                | NY                  | New York            | 230         | 20437172     |
| 35                | ND                  | North Dakota        | 230         | 723393       |
| 44                | TN                  | Tennessee           | 230         | 6495978      |
+-------------------+---------------------+---------------------+-------------+--------------+
(8 rows affected)

Ejemplo 1:unión interna de 3 tablas

El tipo de combinación más popular es la combinación interna, por lo que comenzaremos con eso.

Este es un ejemplo de unión de las tres tablas anteriores con dos uniones internas.

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
INNER JOIN Customers cu  
ON cu.PostalCityId = ci.CityId;

Resultado:

+---------------------+----------------+----------------+
| StateProvinceName   | CityName       | CustomerName   |
|---------------------+----------------+----------------|
| Nebraska            | Lisco          | Homer McKenzie |
| Kansas              | Medicine Lodge | Bart Pitt      |
| New York            | Gasport        | Lisa McQueen   |
| North Dakota        | Jessie         | Steve Simpson  |
| Tennessee           | Frankewing     | Vinn Allen     |
| Colorado            | Bow Mar        | Veejay Smith   |
| North Dakota        | Wimbledon      | Borat Lee      |
+---------------------+----------------+----------------+
(7 rows affected)

Ejemplo 2:combinación de tipos de unión

Puede combinar tipos de unión al unir tres o más mesas.

Este es un ejemplo de cómo combinar una combinación interna con una combinación izquierda.

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
LEFT JOIN Customers cu  
ON cu.PostalCityId = ci.CityId;

Resultado:

---------------------+----------------+----------------+
| StateProvinceName   | CityName       | CustomerName   |
|---------------------+----------------+----------------|
| Colorado            | Bow Mar        | Veejay Smith   |
| Tennessee           | Frankewing     | Vinn Allen     |
| New York            | Gasport        | Lisa McQueen   |
| Kansas              | Medicine Lodge | Bart Pitt      |
| Arizona             | Peeples Valley | NULL           |
| North Dakota        | Jessie         | Steve Simpson  |
| Nebraska            | Lisco          | Homer McKenzie |
| North Dakota        | Wimbledon      | Borat Lee      |
+---------------------+----------------+----------------+
(8 rows affected)

En este caso, tenemos una ciudad (Peeples Valley) que aún no tiene clientes.

La razón por la que ahora podemos ver esa información es porque la combinación izquierda devuelve filas que tienen datos en la tabla izquierda, incluso si no hay filas coincidentes en la tabla izquierda.

El ejemplo anterior que combinó dos combinaciones internas no devolvió esta fila, porque las combinaciones internas descartan filas no coincidentes de ambas tablas. Solo devuelve filas cuando hay al menos una fila en ambas tablas que coincide con la condición de combinación.

Nuevos datos de muestra:3 tablas diferentes

Para los ejemplos restantes, usaremos las siguientes tablas.

Los PetTypes tabla:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Las Pets tabla:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Los Owners tabla:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Simpson    | (489) 591-0408 | NULL              |
| 4         | Boris       | Trump      | (349) 611-8908 | NULL              |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

Tenga en cuenta que:

  • El PetTypeId columna de Pets la tabla es una clave externa del PetTypeId de los PetTypes tabla (que es la clave principal de esa tabla).
  • El OwnerId columna de Pets la tabla es una clave externa del OwnerId columna de los Owners mesa.

Ejemplo 3:combinación izquierda de 3 tablas

Hagamos una combinación de tres tablas usando dos combinaciones izquierdas.

Este es un ejemplo de cómo ejecutar dos combinaciones izquierdas en esas tablas.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o LEFT JOIN Pets p
    ON p.OwnerId = o.OwnerId
LEFT JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+----------------+
| PetName   | PetType   | PetOwner       |
|-----------+-----------+----------------|
| Tweet     | Bird      | Homer Connery  |
| Scratch   | Cat       | Bart Pitt      |
| Bark      | Dog       | Bart Pitt      |
| Fluffy    | Cat       | Nancy Simpson  |
| Fetch     | Dog       | Nancy Simpson  |
| Wag       | Dog       | Nancy Simpson  |
| Fluffy    | Dog       | Boris Trump    |
| Meow      | Cat       | Boris Trump    |
| NULL      | NULL      | Woody Eastwood |
+-----------+-----------+----------------+
(9 rows affected)

Aquí, tenemos un dueño de mascota que no tiene una mascota. Podemos verificar eso mirando el Pets.OwnerId columna, y al ver que no hay ningún valor que se corresponda con el OwnerId de Woody Eastwood en los Owners mesa.

Ejemplo 4:combinación derecha de 3 tablas

La combinación derecha es lo opuesto a la combinación izquierda. Aquí hay un ejemplo usando las mismas tres tablas.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o 
    ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+---------------+
| PetName   | PetType   | PetOwner      |
|-----------+-----------+---------------|
| Tweet     | Bird      | Homer Connery |
| Fluffy    | Cat       | Nancy Simpson |
| Scratch   | Cat       | Bart Pitt     |
| Meow      | Cat       | Boris Trump   |
| Fetch     | Dog       | Nancy Simpson |
| Wag       | Dog       | Nancy Simpson |
| Fluffy    | Dog       | Boris Trump   |
| Bark      | Dog       | Bart Pitt     |
| NULL      | Rabbit    |               |
+-----------+-----------+---------------+
(9 rows affected)

Esta vez tenemos un tipo de mascota extra (Rabbit ), pero no el propietario adicional. Esto se debe a que las combinaciones a la derecha devuelven filas que tienen datos en la tabla de la derecha, incluso si no hay filas coincidentes en la tabla de la izquierda.

Por cierto, la razón por la que el último PetOwner no es NULL (como el último PetName is) se debe a que es el resultado de una concatenación de cadenas. Usé T-SQL CONCAT() función para concatenar el nombre y apellido del propietario.

Ejemplo 5:Unión completa de 3 tablas

La unión completa es como tener una unión izquierda y derecha en una. Devuelve todas las filas, siempre que haya datos coincidentes en una de las tablas.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+----------------+
| PetName   | PetType   | PetOwner       |
|-----------+-----------+----------------|
| Tweet     | Bird      | Homer Connery  |
| Scratch   | Cat       | Bart Pitt      |
| Bark      | Dog       | Bart Pitt      |
| Fluffy    | Cat       | Nancy Simpson  |
| Fetch     | Dog       | Nancy Simpson  |
| Wag       | Dog       | Nancy Simpson  |
| Fluffy    | Dog       | Boris Trump    |
| Meow      | Cat       | Boris Trump    |
| NULL      | NULL      | Woody Eastwood |
| NULL      | Rabbit    |                |
+-----------+-----------+----------------+
(10 rows affected)

Esta vez obtenemos una combinación de los resultados que obtuvimos en los dos ejemplos anteriores.

Ejemplo 6:uniones anidadas

Como se mencionó, también puede hacer uniones anidadas.

Este es un ejemplo de una combinación anidada.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o 
LEFT JOIN    (Pets p
        LEFT JOIN PetTypes pt
        ON p.PetTypeId = pt.PetTypeId)
ON p.OwnerId = o.OwnerId;

Resultado:

+-----------+-----------+----------------+
| PetName   | PetType   | PetOwner       |
|-----------+-----------+----------------|
| Tweet     | Bird      | Homer Connery  |
| Scratch   | Cat       | Bart Pitt      |
| Bark      | Dog       | Bart Pitt      |
| Fluffy    | Cat       | Nancy Simpson  |
| Fetch     | Dog       | Nancy Simpson  |
| Wag       | Dog       | Nancy Simpson  |
| Fluffy    | Dog       | Boris Trump    |
| Meow      | Cat       | Boris Trump    |
| NULL      | NULL      | Woody Eastwood |
+-----------+-----------+----------------+
(9 rows affected)