Zoeken…


Invoering

UNION zoekwoord in SQL wordt gebruikt om te combineren de verklaring resultaten SELECT met elke dubbele. Om UNION te gebruiken en resultaten te combineren, moeten beide SELECT-instructies hetzelfde aantal kolommen met hetzelfde gegevenstype in dezelfde volgorde hebben, maar de lengte van de kolom kan verschillen.

Syntaxis

  • SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE staat]
    UNIE | UNIE ALLEN
    SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE staat]

Opmerkingen

UNION clausules UNION en UNION ALL combineren de resultatenset van twee of meer identiek gestructureerde SELECT-instructies in één resultaat / tabel.

Zowel het aantal kolommen als de kolomtypen voor elke query moeten overeenkomen om een UNION / UNION ALL te laten werken.

Het verschil tussen een UNION en een UNION ALL query is dat de UNION clausule alle dubbele rijen in het resultaat verwijdert, terwijl UNION ALL dat niet doet.

Deze duidelijke verwijdering van records kan query's aanzienlijk vertragen, zelfs als er geen afzonderlijke rijen zijn die hierdoor kunnen worden verwijderd, als u weet dat er geen duplicaten zijn (of niet kan schelen), standaard altijd UNION ALL voor een meer geoptimaliseerde query.

Basic UNION ALL-zoekopdracht

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)
);

Laten we zeggen dat we de namen van alle managers van onze afdelingen willen extraheren.

Met behulp van een UNION kunnen we alle werknemers krijgen van zowel HR- als financiële afdelingen, die de position van manager

SELECT 
    FirstName, LastName   
FROM 
    HR_EMPLOYEES  
WHERE 
    Position = 'manager'  
UNION ALL  
SELECT 
    FirstName, LastName  
FROM 
    FINANCE_EMPLOYEES  
WHERE 
    Position = 'manager'  

De UNION instructie verwijdert dubbele rijen uit de queryresultaten. Omdat het mogelijk is om mensen met dezelfde naam en functie in beide afdelingen te hebben, gebruiken we UNION ALL om duplicaten niet te verwijderen.

Als u een alias voor elke uitvoerkolom wilt gebruiken, kunt u deze als volgt in de eerste select-opdracht plaatsen:

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'  

Eenvoudige uitleg en voorbeeld

In simpele termen:

  • UNION voegt 2 resultatensets samen en verwijdert duplicaten uit de resultatenset
  • UNION ALL voegt zich bij 2 resultatensets zonder te proberen duplicaten te verwijderen

Een fout die veel mensen maken, is het gebruik van een UNION wanneer de duplicaten niet hoeven te worden verwijderd. De extra prestatiekosten ten opzichte van grote resultatensets kunnen zeer aanzienlijk zijn.

Wanneer u UNION nodig heeft

Stel dat u een tabel moet filteren op 2 verschillende kenmerken en dat u afzonderlijke niet-geclusterde indexen voor elke kolom hebt gemaakt. Met een UNION kunt u beide indexen gebruiken en tegelijkertijd duplicaten voorkomen.

SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2

Dit vereenvoudigt het afstemmen van uw prestaties, omdat alleen eenvoudige indexen nodig zijn om deze query's optimaal uit te voeren. U kunt zelfs in staat zijn om met wat minder niet-geclusterde indexen rond te komen en de algehele schrijfprestaties ook ten opzichte van de brontabel te verbeteren.

Wanneer u UNION ALL

Stel dat u nog steeds een tabel moet filteren op 2 attributen, maar dat u geen dubbele records hoeft te filteren (omdat het niet uitmaakt of omdat uw gegevens geen duplicaten produceren tijdens de unie vanwege uw ontwerp van het gegevensmodel).

SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2

Dit is vooral handig bij het maken van weergaven die gegevens samenvoegen die zijn ontworpen om fysiek over meerdere tabellen te worden verdeeld (misschien om prestatieredenen, maar wil nog steeds records samenvatten). Omdat de gegevens al zijn gesplitst, voegt het verwijderen van de database-engine duplicaten geen waarde toe en voegt het alleen extra verwerkingstijd toe aan de query's.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow