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

SQL Cross Join

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

SQL CROSS JOIN (nebo FULL OUTER JOIN ) vrátí řádky, které kombinují každý řádek z první tabulky s každým řádkem z druhé tabulky.

Jinými slovy, vrací kartézský součin řádků z tabulek ve spojení.

Syntaxe

Křížové spojení určíte v FROM doložka.

Syntaxe vypadá takto:

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

Příklad 1

Zde je příklad k demonstraci.

Ukázková data

Za prvé, zde jsou tabulky, které použijeme jako příklad.

t1 tabulka:

+--------+
| col1   |
|--------|
| a      |
| b      |
| c      |
+--------+

t2 tabulka:

+--------+
| col1   |
|--------|
| 1      |
| 2      |
| 3      |
+--------+

Dotaz Cross Join

Zde je příklad provedení křížového spojení proti těmto dvěma tabulkám.

SELECT * FROM t1 
CROSS JOIN t2;

Výsledek:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Náš dotaz tedy vrátí 9 řádků, i když v každé tabulce jsou pouze 3 řádky.

Je to kvůli tomu, jak funguje křížové spojení. Počet vrácených řádků je počet řádků v levé tabulce vynásobený počtem řádků v pravé tabulce.

Podívejte se, jak iteruje levou tabulkou a vypisuje každý řádek v pravé tabulce pro každý řádek v levé tabulce.

To má stejný účinek jako následující:

SELECT * FROM t1, t2

Výsledek:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Příklad 2

Co se stane, když přidáme WHERE klauzule k našemu křížovému spojení.

SELECT * FROM t1 
CROSS JOIN t2
WHERE t1.col1 = 'a';

Výsledek:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| a      | 2      |
| a      | 3      |
+--------+--------+
(3 rows affected)

Příklad 3

Předpokládejme, že máme následující tabulky.

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)

V tomto případě Pets.PetTypeId sloupec je cizí klíč PetTypes.PetTypeId sloupec.

Nyní je zde příklad spuštění křížového spojení na těchto dvou tabulkách, ale pomocí WHERE doložka.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt
WHERE 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)

Přidání WHERE klauzule ke křížovému spojení z něj udělala vnitřní spojení.

Zde je to, co se stane, když odstraníme WHERE doložka.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt;

Výsledek:

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

Dostaneme křížové spojení, které vrátí 32 řádků.


  1. Oracle CLOB nemůže vložit více než 4000 znaků?

  2. Nelze načíst SqlServerSpatial.dll

  3. Použijte FILEGROUP_ID() k vrácení ID skupiny souborů na SQL Server

  4. Android Sqlite při upgradu odstraňte tabulku z databáze