sql >> Databáze >  >> RDS >> Database

SQL Right Join

Tento článek poskytuje přehled RIGHT JOIN v SQL a také některé základní příklady.

Také známý jako RIGHT OUTER JOIN , RIGHT JOIN vrátí řádky, které mají data v pravé tabulce (vpravo od JOIN klíčové slovo), i když v levé tabulce nejsou žádné odpovídající řádky.

Syntaxe

Pravé spojení určíte v FROM doložka. Můžete použít buď RIGHT JOIN nebo RIGHT OUTER JOIN syntaxe.

Pomocí RIGHT JOIN syntaxe:

SELECT *
FROM Table1 RIGHT JOIN Table2 
ON Table1.Column = Table2.Column;

Pomocí RIGHT OUTER JOIN syntaxe:

SELECT *
FROM Table1 RIGHT OUTER JOIN Table2 
ON Table1.Column = Table2.Column;

Oba dělají přesně to samé. Jde jen o to, že OUTER klíčové slovo je nepovinné.

Příklady

Zde je několik příkladů k demonstraci.

Ukázková data

Za prvé, zde jsou tabulky, které použijeme pro příklady.

PetTypes tabulka:

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

Pets tabulka:

+---------+-------------+-----------+-----------+------------+
| 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)

Owners tabulka:

+-----------+-------------+------------+----------------+-------------------+
| 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] |
+-----------+-------------+------------+----------------+-------------------+

Všimněte si, že:

  • PetTypeId ve sloupci Pets tabulka je cizí klíč PetTypeId z PetTypes tabulka (což je primární klíč této tabulky).
  • OwnerId ve sloupci Pets tabulka je cizí klíč OwnerId ve sloupci Owners stůl.

Správný dotaz na připojení

Zde je příklad provedení správného spojení proti dvěma z těchto tabulek.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;

Výsledek:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Tweet     | Bird      |
| Fluffy    | Cat       |
| Scratch   | Cat       |
| Meow      | Cat       |
| Fetch     | Dog       |
| Wag       | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Správné spojení způsobí, že získáme PetType hodnota, která neodpovídá PetName . Konkrétně nejsou králíci jako domácí mazlíčci. Ale správné spojení způsobí Rabbit být vrácen, i když v Pets není žádné zvíře stůl tohoto typu. Výsledkem je NULL hodnotu v PetName sloupec proti Rabbit .

Stalo se to jen proto, že Rabbit byl v pravé tabulce (tj. vpravo od RIGHT JOIN klíčová slova).

Co se stane, když v našem dotazu změníme pořadí tabulky.

SELECT 
    p.PetName,
    pt.PetType
FROM PetTypes pt
RIGHT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;

Výsledek:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Tentokrát Rabbits nebyl vrácen. Je to proto, že jeho tabulka (PetTypes ) byl na levé straně spojení.

Pokud bychom chtěli Rabbits, museli bychom to změnit na levé spojení nebo úplné spojení které mají být vráceny pomocí této tabulky.

Správné spojení na 3 stolech

Zde je příklad provedení správného spojení na všech třech stolech.

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

Výsledek:

+-----------+-----------+----------------+
| 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)

Tentokrát máme majitele domácího mazlíčka, který žádné zvíře nemá.

Mohli bychom znovu zamíchat pořadím stolů a dostali bychom jiný výsledek.

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;

Výsledek:

+-----------+-----------+---------------+
| 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)

Tentokrát jsme dostali extra typ domácího mazlíčka (Rabbit ), ale ne další vlastník.

Pokud vás zajímá, proč poslední PetOwner není NULL (jako poslední PetName je), je to proto, že je výsledkem zřetězení řetězců. Použil jsem T-SQL CONCAT() funkce ke zřetězení jména a příjmení vlastníka.


  1. Načíst data z uložené procedury, která má více sad výsledků

  2. Aspekty řetězců v .NET

  3. Android – pokuste se znovu otevřít již uzavřený objekt:SQLiteQuery pomocí loaderManager

  4. Oracle sekvence, ale pak v MS SQL Server