sql >> Databasteknik >  >> RDS >> Database

Gå med 3 tabeller i SQL

I SQL kan du sammanfoga tre tabeller eller fler genom att lägga till ytterligare en join efter den första.

Du kan också köra kapslade kopplingar genom att ange en koppling som kopplingsvillkor för en annan.

Syntax

Det vanligaste sättet att sammanfoga tre bord är ungefär så här:

VÄLJ *FRÅN tabell 1 INNER JOIN Tabell2 ON ConditionINNER JOIN Table3 ON Condition; 

Detta använder en inre koppling, men du kan ange önskad kopplingstyp som med vilken annan koppling som helst. Du kan också kombinera anslutningstyper om det behövs (exempel nedan).

Du kan också använda kapslade kopplingar genom att ange en koppling som kopplingsvillkor för en annan koppling. Så här:

VÄLJ *FRÅN Tabell1 JOIN (Tabell2 JOIN Tabell3 PÅ-villkor)PÅ-villkor; 

Exempeldata – De tre tabellerna

Anta att vi har följande tre tabeller.

Kunder tabell:

+--------------+----------------+------------- --+----------------+| Kund-ID | Kundnamn | PostalCityId | Telefonnummer ||--------------+----------------+-------------- -+----------------|| 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 rader påverkade)

Städer tabell:

+----------+----------------+------------------------ --+--------------+| CityId | Stadsnamn | StateProvinceId | Befolkning ||--------+----------------+------------------------ +---------------------|| 3673 | Bow Mar | 6 | 866 || 12152 | Frankewing | 44 | NULL || 12748 | Gasport | 33 | 1248 || 21692 | Medicin 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 rader påverkade)

StateProvinces tabell:

+--------------------+---------------------+---- ------------------+-------------+-------------+| StateProvinceId | StateProvinceCode | StateProvinceName | CountryId | Befolkning ||------------------------+---------------------+----- ----------------+-------------+--------------|| 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 rader påverkade )

Exempel 1 – Inner Join 3 Tabeller

Den mest populära typen av sammanfogning är den inre sammanfogningen, så vi börjar med det.

Här är ett exempel på att sammanfoga de tre ovanstående tabellerna med två inre sammanfogningar.

VÄLJ s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces SINER JOIN Cities AS ciON ci.StateProvinceID =s.StateProvinceIDINNER JOIN Kunder cu ON cu.PostalCityId =ci.CityId; 

Resultat:

+---------------------+----------------+------- ----------+| StateProvinceName | Stadsnamn | Kundnamn ||---------------------+----------------+-------- --------|| Nebraska | Lisco | Homer McKenzie || Kansas | Medicin 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 rader påverkade)

Exempel 2 – Kombinera kopplingstyper

Du kan kombinera anslutningstyper när du går med i tre eller fler bord.

Här är ett exempel på att kombinera en inre koppling med en vänster koppling.

VÄLJ s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces SINER JOIN Cities AS ciON ci.StateProvinceID =s.StateProvinceIDLEFT JOIN Kunder cu ON cu.PostalCityId =ci.CityId; 

Resultat:

---------------------+----------------+-------- --------+| StateProvinceName | Stadsnamn | Kundnamn ||---------------------+----------------+-------- --------|| Colorado | Bow Mar | Veejay Smith || Tennessee | Frankewing | Vinn Allen || New York | Gasport | Lisa McQueen || Kansas | Medicin Lodge | Bart Pitt || Arizona | Peeples Valley | NULL || North Dakota | Jessie | Steve Simpson || Nebraska | Lisco | Homer McKenzie || North Dakota | Wimbledon | Borat Lee |+---------------------+----------------+------- ----------+(8 rader påverkade)

I det här fallet har vi en stad (Peeples Valley) som ännu inte har några kunder.

Anledningen till att vi nu kan se den informationen är att den vänstra kopplingen returnerar rader som har data i den vänstra tabellen, även om det inte finns några matchande rader i den vänstra tabellen.

Det föregående exemplet som kombinerade två inre kopplingar returnerade inte den här raden, eftersom inre kopplingar kastar bort omatchade rader från båda tabellerna. Den returnerar bara rader när det finns minst en rad i båda tabellerna som matchar kopplingsvillkoret.

Nya exempeldata – 3 olika tabeller

För de återstående exemplen använder vi följande tabeller.

PetTypes tabell:

+-------------+-----------+| PetTypeId | PetType ||-------------+---------|| 1 | Fågel || 2 | Katt || 3 | Hund || 4 | Kanin |+-------------+------------+(4 rader påverkade)

Husdjur tabell:

+--------+-------------+------------+-------- -+------------+| PetId | PetTypeId | Ägar-ID | PetName | DOB ||--------+------------------------ +------------|| 1 | 2 | 3 | Fluffig | 2020-11-20 || 2 | 3 | 3 | Hämta | 2019-08-16 || 3 | 2 | 2 | Skrapa | 2018-10-01 || 4 | 3 | 3 | Wag | 2020-03-15 || 5 | 1 | 1 | Tweet | 2020-11-28 || 6 | 3 | 4 | Fluffig | 2020-09-17 || 7 | 3 | 2 | Bark | NULL || 8 | 2 | 4 | Mjau | NULL |+---------+------------------------ +------------+(8 rader påverkade)

Ägarna tabell:

+-------+-----------------+------- ----------+---------------------------+| Ägar-ID | Förnamn | Efternamn | Telefon | E-post ||----------------------------------------- ----+-------------------------|| 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] |+------------+------------------+------------+---- ------------+---------------------------+

Observera att:

  • PetTypeId kolumnen i Husdjur tabellen är en främmande nyckel för PetTypeId av PetTypes tabell (som är den primära nyckeln för den tabellen).
  • OwnerId kolumnen i Husdjur tabellen är en främmande nyckel för OwnerId kolumnen i Ägare tabell.

Exempel 3 – Vänsterkoppling 3 tabeller

Låt oss göra en sammanfogning med tre bord med två vänsteranslutningar.

Här är ett exempel på att köra två vänsteranslutningar mot dessa bord.

SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) SOM PetOwnerFROM Ägare o LEFT JOIN Pets p ON p.OwnerId =o.OwnerIdLEFT JOIN PetTypes pt ON p. PetTypeId =pt.PetTypeId; 

Resultat:

+-------+------------+----------------+| PetName | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Fågel | Homer Connery || Skrapa | Katt | Bart Pitt || Bark | Hund | Bart Pitt || Fluffig | Katt | Nancy Simpson || Hämta | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffig | Hund | Boris Trump || Mjau | Katt | Boris Trump || NULL | NULL | Woody Eastwood |+-----------+------------+----------------+(9 rader påverkade) 

Här har vi en djurägare som inte har ett husdjur. Vi kan verifiera det genom att titta på Pets.OwnerId kolumnen och ser att det inte finns något värde som motsvarar Woody Eastwoods OwnerId i Ägare bord.

Exempel 4 – Högerkoppling 3 tabeller

Den högra sammanfogningen är motsatsen till den vänstra sammanfogningen. Här är ett exempel med samma tre tabeller.

VÄLJ p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) SOM PetOwnerFROM Husdjur p RIGHT JOIN Ägare o PÅ p.OwnerId =o.OwnerIdRIGHT JOIN PetTypes pt ON sid. PetTypeId =pt.PetTypeId; 

Resultat:

+-------+------------+------------+| PetName | PetType | PetOwner ||-----------+-----------+---------------------|| Tweet | Fågel | Homer Connery || Fluffig | Katt | Nancy Simpson || Skrapa | Katt | Bart Pitt || Mjau | Katt | Boris Trump || Hämta | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffig | Hund | Boris Trump || Bark | Hund | Bart Pitt || NULL | Kanin | |+-----------+-----------+---------------+(9 rader påverkade)

Den här gången fick vi en extra husdjurstyp (Kanin ), men inte den extra ägaren. Detta beror på att höger sammanfogar returrader som har data i den högra tabellen, även om det inte finns några matchande rader i den vänstra tabellen.

Förresten, anledningen till den senaste PetOwner är inte NULL (som sist PetName is) beror på att det är ett resultat av en strängsammansättning. Jag använde T-SQL CONCAT() funktion för att sammanfoga ägarens för- och efternamn.

Exempel 5 – Fullständig sammanfogning 3 tabeller

Den fullständiga sammanfogningen är som att ha en vänster och höger sammanfogning i ett. Den returnerar alla rader, så länge det finns matchande data i en av tabellerna.

VÄLJ p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) SOM PetOwnerFROM Ägare o FULL GÅ MED Pets p ON p.OwnerId =o.OwnerIdFULL JOIN PetTypes pt ON p. PetTypeId =pt.PetTypeId; 

Resultat:

+-------+------------+----------------+| PetName | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Fågel | Homer Connery || Skrapa | Katt | Bart Pitt || Bark | Hund | Bart Pitt || Fluffig | Katt | Nancy Simpson || Hämta | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffig | Hund | Boris Trump || Mjau | Katt | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kanin | |+-----------+-----------+----------------+(10 rader påverkade) 

Den här gången får vi en kombination av resultaten som vi fick i de två föregående exemplen.

Exempel 6 – Kapslade kopplingar

Som nämnts kan du också göra kapslade sammanfogningar.

Här är ett exempel på en kapslad koppling.

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

Resultat:

+-------+------------+----------------+| PetName | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Fågel | Homer Connery || Skrapa | Katt | Bart Pitt || Bark | Hund | Bart Pitt || Fluffig | Katt | Nancy Simpson || Hämta | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffig | Hund | Boris Trump || Mjau | Katt | Boris Trump || NULL | NULL | Woody Eastwood |+-----------+------------+----------------+(9 rader påverkade) 

  1. Konvertera ett månadsnummer till månadsnamnet i SQL Server (T-SQL)

  2. PHP PDO och MySQLi

  3. Är det en dålig idé att ha ett "ELLER" i ett INNER JOIN-tillstånd?

  4. Oracle:SQL-fråga som returnerar rader med endast numeriska värden