Sök…


Introduktion

UNION nyckelord i SQL används för att kombinera för att SELECT uttalande resultat utan alla duplikat. För att använda UNION och kombinera resultat båda SELECT-satserna bör ha samma antal kolumner med samma datatyp i samma ordning, men kolumnens längd kan vara annorlunda.

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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow