SQL
UNIE / UNIE ALLEN
Zoeken…
Invoering
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.