Guide for GroupBy 7: Operacions de conjunts


Això és una guia per ajudar-te a començar amb aquest problema — no és la solució.

Com abordar aquest problema

Aquest problema practica les operacions de conjunts: agafen el resultat de dues consultes SELECT i el combinen com si fossin dos conjunts de files. No cal cap JOIN: les dues consultes s'escriuen per separat i s'enganxen amb una paraula clau.

La sintaxi que necessites

SELECT col1, col2 FROM taulaA WHERE condicioA
UNION | UNION ALL | INTERSECT | EXCEPT
SELECT col1, col2 FROM taulaB WHERE condicioB
  • UNION: les files que surten a qualsevol de les dues consultes, sense repeticions.
  • UNION ALL: el mateix, però mantenint les repeticions (no elimina duplicats).
  • INTERSECT: només les files que surten a totes dues consultes.
  • EXCEPT: les files de la primera consulta que no surten a la segona (l'ordre importa: A EXCEPT B no és el mateix que B EXCEPT A).
  • Les dues consultes han de tenir el mateix nombre de columnes, i es comparen columna a columna, per posició.

Pregunta per pregunta

Pregunta 1. Es demana el que hi ha a una taula i no a l'altra: és la feina d'una de les quatre operacions. Fixa't bé en quina taula va primer, i compara només la columna que es demana (si compares la fila sencera, el resultat canvia).

Pregunta 2. Ara la comparació és de la fila completa: les dues consultes han de seleccionar les quatre columnes, en el mateix ordre. Una fila només es considera igual si coincideixen totes les columnes. Alerta: a Employees3 hi ha salaris buits (NULL), i això fa que algunes files que semblen iguals no ho siguin.

Pregunta 3. Cada meitat té la seva pròpia condició WHERE, i l'enunciat diu explícitament que no s'han d'eliminar les repeticions: tria l'operació que les conserva. Revisa també els operadors de comparació ("o més" i "exactament" no s'escriuen igual).

Un exemple semblant

Noms de pila que surten a Employees2 però no a Employees:

SELECT FirstName FROM Employees2
EXCEPT
SELECT FirstName FROM Employees

Noms de pila dels que cobren poc a Employees juntament amb els dels que cobren molt a Employees3, sense repetir:

SELECT FirstName FROM Employees WHERE Salary < 1200
UNION
SELECT FirstName FROM Employees3 WHERE Salary > 1600

Paranys habituals:

  • Fer servir UNION quan es demanen les repeticions: UNION les elimina, UNION ALL no.
  • Posar les taules al revés en un EXCEPT: el resultat és completament diferent.
  • Seleccionar un nombre diferent de columnes (o en un ordre diferent) a cada costat de l'operació.
  • Posar un ORDER BY al mig: si en vols un, només pot anar al final de tot (i aquí el jutge no mira l'ordre).

Tornar al problema