Problem:
Du vil gerne vise data fra givne kolonner (af en lignende datatype) fra to tabeller i SQL.
Eksempel:
Der er to tabeller i vores database:employee
og customer
.
employee
tabel indeholder data i følgende kolonner:id , fornavn , efternavn , og alder .
id | fornavn | efternavn | alder |
---|---|---|---|
1 | Tom | Møller | 22 |
2 | John | Smith | 26 |
3 | Lisa | Williams | 30 |
4 | Charles | Davis | 21 |
5 | James | Moore | 22 |
customer
tabel indeholder data i følgende kolonner:id , fornavn , efternavn , og alder .
id | fornavn | efternavn | alder |
---|---|---|---|
1 | Milano | Smith | 45 |
2 | Charles | Davis | 21 |
3 | Mærk | Backer | 19 |
Lad os i ét resultatsæt vise fornavn, efternavn og alder for alle personer i databasen, både medarbejdere og kunder.
Løsning 1:
Vi bruger UNION ALL
at samle data fra kolonner i to tabeller.
Her er den forespørgsel, du ville skrive:
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
Her er resultatet:
fornavn | efternavn | alder |
---|---|---|
Tom | Møller | 22 |
John | Smith | 26 |
Lisa | Williams | 30 |
Charles | Davis | 21 |
James | Moore | 28 |
Milano | Smith | 45 |
Charles | Davis | 21 |
Mark | Backer | 19 |
Diskussion:
Brug UNION ALL-sætningen til at forbinde data fra kolonner i to eller flere tabeller. I vores eksempel samler vi data fra employee
og customer
tabeller. Til venstre for UNION ALL-nøgleordet skal du sætte den første SELECT-sætning for at hente data fra den første tabel (i vores eksempel, tabellen employee
). Til højre skal du bruge en anden SELECT-sætning til at hente data fra den anden tabel (i vores eksempel, customer
).
Husk at de valgte data i begge tabeller skal være af samme datatype i hver kolonne. For eksempel, hvis den første kolonne i den første SELECT er en strengdatatype, skal den første kolonne i den anden SELECT også være en strengdatatype. Hvis den anden kolonne i den første SELECT-sætning er et heltal, skal den anden kolonne i den anden tabel også være en heltalstype.
I den første forespørgsel valgte vi alder (medarbejderens alder, som er en heltalsdatatype) til den tredje kolonne. Derfor er den tredje kolonne i den anden SELECT også en heltalsværdi; det er alderen af kunden.
Den anden kolonne i begge SELECT-sætninger er af samme datatype. Men hvis værdierne er de samme i begge tabeller, vil de blive vist flere gange; for eksempel vises 'Charles Davis 21' to gange i resultatsættet.
Hvad hvis du ikke vil have flere identiske poster i resultattabellen? I dette tilfælde skal du bruge UNION
. Det ligner UNION ALL
, men det fjerner duplikerede poster. Se på følgende eksempel.
Løsning 2:
Her er forespørgslen, der undgår duplikerede poster:
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
Her er resultatet af ovenstående forespørgsel:
fornavn | efternavn |
---|---|
Mark | Backer |
James | Moore |
John | Smith |
Charles | Davis |
Milano | Smith |
Tom | Møller |
Lisa | Williams |
Bemærk:
UNION ALL
er hurtigere end UNION
, men UNION
fjerner duplikerede rækker. Valget afhænger af de resultatdata, vi har brug for.