Guide for Empleats 8: Autojoins
Com abordar aquest problema
Practiques l'autojoin: unir una taula amb ella mateixa. Serveix quan vols comparar una fila amb una altra fila de la mateixa taula (dos empleats entre ells). Imagina que tens dues còpies de la taula, una anomenada a i l'altra b.
La sintaxi que necessites
SELECT a.columna, b.columna
FROM taula a
JOIN taula b ON condicio_entre_a_i_b;
- Els àlies són obligatoris: com que és la mateixa taula dues vegades,
aibsón l'única manera de distingir "el primer empleat" del "segon". - A l'
ONhi poses qualsevol condició que relacioni les dues còpies (igualtats, desigualtats, o una combinació ambAND). - Si vols parelles, cal evitar emparellar un empleat amb ell mateix i que cada parella surti dues vegades (A-B i B-A). Exigir que l'
Iddel primer sigui més petit que el del segon resol tots dos problemes. - També pots fer servir una de les còpies per "fixar" un empleat concret, posant al
ONuna condició que només compleixi ell.
Pregunta per pregunta
Pregunta 1. Parelles d'empleats: quina columna han de tenir igual? Afegeix la condició que evita duplicats (te la dona l'enunciat). Dues columnes: cognom de a, cognom de b.
Pregunta 2. Aquí una de les dues còpies representa només l'empleat de referència (identificat pel cognom), i l'altra recorre tots els empleats. La comparació de salaris va entre les dues còpies. Retorna el nom i el cognom de l'empleat que cobra més, no del de referència.
Pregunta 3. Combina dues condicions: una columna ha de ser igual i una altra ha de ser diferent (<>), a més de la condició contra duplicats. Tres columnes; el salari el pots treure de qualsevol de les dues còpies, perquè és el mateix.
Un exemple semblant
Parelles d'empleats nascuts el mateix mes de l'any (sense repetir parelles):
SELECT a.FirstName, b.FirstName
FROM Employees a
JOIN Employees b ON substr(a.BirthDate, 6, 2) = substr(b.BirthDate, 6, 2)
AND a.Id < b.Id;
Empleats nascuts abans que l'empleat de cognom 'Twigg':
SELECT a.FirstName, a.BirthDate
FROM Employees a
JOIN Employees b ON b.LastName = 'Twigg' AND a.BirthDate < b.BirthDate;
Paranys habituals:
- Oblidar
a.Id < b.Id(o posar<>): cada empleat surt emparellat amb ell mateix, o cada parella surt dues vegades. - Escriure una columna sense àlies (
LastName): és ambigua, perquè existeix a les dues còpies. - Mostrar les columnes de la còpia equivocada (la de referència en lloc de la que recorre la taula).
- El jutge no mira els noms de les columnes ni l'ordre de les files, però sí el nombre de columnes i el seu ordre: no afegeixis columnes "de regal" (com l'identificador) si no te les demanen.