Zoeken…


Syntaxis

  • UNION DISTINCT - dedups na het combineren van de SELECT's
  • UNION ALL - niet-dedup (sneller)
  • UNION - de standaardinstelling is DISTINCT
  • SELECT ... UNION SELECT ... - is OK, maar dubbelzinnig bij ORDER BY
  • (SELECT ...) UNION (SELECT ...) ORDER BY ... - lost de dubbelzinnigheid op

Opmerkingen

UNION maakt geen gebruik van meerdere CPU's.

UNION heeft altijd * een tijdelijke tabel nodig om de resultaten te verzamelen. * Vanaf 5.7.3 / MariaDB 10.1 leveren sommige vormen van UNION de resultaten zonder een tmp-tabel (dus sneller).

SELECT-instructies combineren met UNION

U kunt de resultaten van twee identiek gestructureerde zoekopdrachten combineren met het UNION trefwoord.

Als u bijvoorbeeld een lijst met alle contactinformatie uit twee afzonderlijke tabellen, authors en editors , wilt, kunt u het trefwoord UNION als volgt gebruiken:

select name, email, phone_number 
from authors

union

select name, email, phone_number
from editors

Het gebruik van union op zichzelf zal duplicaten verwijderen. Als u duplicaten in uw zoekopdracht wilt bewaren, kunt u het sleutelwoord ALL als volgt gebruiken: UNION ALL .

BESTELLEN BIJ

Als u de resultaten van een UNION moet sorteren, gebruikt u dit patroon:

( SELECT ... )
UNION
( SELECT ... )
ORDER BY

Zonder de haakjes zou de laatste ORDER BY tot de laatste SELECT behoren.

Paginering via OFFSET

Bij het toevoegen van een LIMIT aan een UNION is dit het patroon dat moet worden gebruikt:

( SELECT ... ORDER BY x  LIMIT 10 )
UNION
( SELECT ... ORDER BY x  LIMIT 10 )
ORDER BY x  LIMIT 10

Omdat je niet kunt voorspellen uit welke SELECT ('s) de "10" zal komen, moet je van elk 10 halen en vervolgens de lijst verder afbouwen door zowel ORDER BY als LIMIT herhalen.

Voor de 4e pagina van 10 items is dit patroon nodig:

( SELECT ... ORDER BY x  LIMIT 40 )
UNION
( SELECT ... ORDER BY x  LIMIT 40 )
ORDER BY x  LIMIT 30, 10

Dat wil zeggen, verzamel 4 pagina's in elke SELECT en voer dan de OFFSET in de UNION .

Gegevens combineren met verschillende kolommen

SELECT name, caption as title, year, pages FROM books 
UNION
SELECT name, title, year, 0 as pages FROM movies

Wanneer u twee recordsets combineert met verschillende kolommen, emuleer dan de ontbrekende sets met standaardwaarden.

UNION ALL en UNION

SELECT 1,22,44 UNION SELECT 2,33,55

voer hier de afbeeldingsbeschrijving in

SELECT 1,22,44 UNION SELECT 2,33,55 UNION SELECT 2,33,55

Het resultaat is hetzelfde als hierboven.

gebruik UNION ALL

wanneer

SELECTEER 1,22,44 UNION SELECT 2,33,55 UNION ALL SELECTEER 2,33,55

voer hier de afbeeldingsbeschrijving in

Combineren en samenvoegen van gegevens op verschillende MySQL-tabellen met dezelfde kolommen in unieke rijen en lopende query

Deze UNION ALL combineert gegevens uit meerdere tabellen en dient als alias voor de tabelnaam om te gebruiken voor uw vragen:

SELECT YEAR(date_time_column), MONTH(date_time_column), MIN(DATE(date_time_column)), MAX(DATE(date_time_column)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM (
    (SELECT date_time_column, ip FROM server_log_1 WHERE state = 'action' AND log_id = 150) UNION ALL
    (SELECT date_time_column, ip FROM server_log_2 WHERE state = 'action' AND log_id = 150) UNION ALL
    (SELECT date_time_column, ip FROM server_log_3 WHERE state = 'action' AND log_id = 150) UNION ALL
    (SELECT date_time_column, ip FROM server_log WHERE state = 'action' AND log_id = 150)
) AS table_all
GROUP BY YEAR(date_time_column), MONTH(date_time_column);


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