SQL
UNION / UNION ALL
Sök…
Introduktion
Syntax
- VÄLJ kolumn_1 [, kolumn_2] FRÅN tabell_1 [, tabell_2] [VAR tillstånd]
UNION | UNION ALLA
VÄLJ kolumn_1 [, kolumn_2] FRÅN tabell_1 [, tabell_2] [VAR tillstånd]
Anmärkningar
UNION
och UNION ALL
klausuler kombinerar resultatset för två eller flera identiskt strukturerade SELECT-uttalanden till ett enda resultat / tabell.
Både kolumnantalet och kolumntyperna för varje fråga måste matcha för att en UNION
/ UNION ALL
ska fungera.
Skillnaden mellan en UNION
och en UNION ALL
fråga är att UNION
klausulen kommer att ta bort alla duplicerade rader i resultatet där UNION ALL
kommer att göra det.
Detta tydliga borttagande av poster kan betydligt långsamma frågor även om det inte finns några tydliga rader som ska tas bort på grund av detta om du vet att det inte kommer att finnas några duplikat (eller inte bryr sig) är alltid standard för UNION ALL
för en mer optimerad fråga.
Grundläggande UNION ALL-fråga
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
Låt oss säga att vi vill hämta namnen på alla managers
från våra avdelningar.
Med hjälp av en UNION
vi kan få alla anställda från både HR och ekonomiavdelningar, som håller position
av en manager
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
UNION
uttalandet tar bort duplicerade rader från frågeställningarna. Eftersom det är möjligt att ha personer med samma namn och position i båda avdelningarna använder vi UNION ALL
, för att inte ta bort dubbletter.
Om du vill använda ett alias för varje utgångskolumn kan du bara placera dem i det första markeringssatsen på följande sätt:
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Enkel förklaring och exempel
I enkla termer:
-
UNION
ansluter till två resultatuppsättningar medan du tar bort dubbletter från resultatsatsen -
UNION ALL
ansluter till två resultatuppsättningar utan att försöka ta bort dubbletter
Ett misstag som många gör är att använda en
UNION
när de inte behöver ta bort dubbletterna. Den extra prestandakostnaden mot stora resultatuppsättningar kan vara mycket betydande.
När du kanske behöver UNION
Anta att du måste filtrera en tabell mot två olika attribut, och du har skapat separata icke-klusterade index för varje kolumn. En UNION
gör att du kan utnyttja båda indexen samtidigt som du förhindrar dubbletter.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
Detta förenklar din prestandajustering eftersom endast enkla index behövs för att utföra dessa frågor optimalt. Du kanske till och med klarar av med ganska färre index som inte är klusterade och förbättrar den totala skrivprestandan också mot källtabellen.
När du kanske behöver UNION ALL
Anta att du fortfarande behöver filtrera en tabell mot två attribut, men du behöver inte filtrera duplicerade poster (antingen för att det inte spelar någon roll eller att dina data inte skulle producera några dubbletter under unionen på grund av din datamodellkonstruktion).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
Detta är särskilt användbart när du skapar vyer som sammanfogar data som är utformade för att fysiskt delas upp i flera tabeller (kanske av prestandaskäl, men ändå vill rulla upp poster). Eftersom informationen redan är uppdelad, har databasmotorn att ta bort dubbletter inte något värde och lägger bara till ytterligare behandlingstid till frågorna.