Guide for Cavallers i Dracs 8: JOINs i subconsultes


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

Com abordar aquest problema

Combines tres eines: un JOIN entre dracs i cavallers, una agrupació amb GROUP BY / HAVING sobre el resultat del JOIN, i una subconsulta que calcula un valor (com una mitjana) per comparar-hi cada fila.

La sintaxi que necessites

JOIN + agrupació:

SELECT a.grup, SUM(b.valor)
FROM taula_a a
INNER JOIN taula_b b ON b.columna_que_apunta = a.clau
GROUP BY a.grup
HAVING SUM(b.valor) > limit;

Subconsulta escalar (retorna un sol valor):

SELECT columna
FROM taula
WHERE valor > (SELECT AVG(valor) FROM taula);
  • WHERE filtra files abans d'agrupar; HAVING filtra grups després d'agrupar i pot fer servir funcions d'agregació.
  • La subconsulta entre parèntesis s'executa i el seu resultat (un número) es fa servir com si l'haguessis escrit a mà.

Pregunta per pregunta

Pregunta 1. Cal unir les dues taules per la relació drac-cavaller, agrupar per cavaller i sumar una columna dels dracs. La condició "suma superior a 2000" és sobre un agregat: pensa si va al WHERE o al HAVING. Dues columnes.

Pregunta 2. Un JOIN sense agrupar, amb dues condicions: una sobre una columna del cavaller i una altra sobre una columna del drac. Mira bé a quina taula és cada columna.

Pregunta 3. Aquí no cal cap JOIN: és una subconsulta que calcula la mitjana d'una columna de tota la taula, i la consulta exterior compara cada drac amb aquest valor. Una sola columna.

Un exemple semblant

Nombre de dracs morts per cavallers de cada títol, només per als títols amb 3 dracs o més:

SELECT k.Title, COUNT(*)
FROM Knights k
INNER JOIN Dragons d ON d.KilledBy = k.Nickname
GROUP BY k.Title
HAVING COUNT(*) >= 3;

El drac (o dracs) amb el màxim de víctimes conegudes:

SELECT Name, KnownVictims
FROM Dragons
WHERE KnownVictims = (SELECT MAX(KnownVictims) FROM Dragons);

Paranys habituals:

  • Posar una funció d'agregació al WHERE (WHERE SUM(...) > ... o WHERE valor > AVG(valor)): és un error. Usa HAVING o una subconsulta.
  • Agrupar per una columna i mostrar-ne una altra que no és al GROUP BY ni dins d'una funció d'agregació.
  • Escriure el valor de la mitjana a mà (calculat abans): si les dades canvien, la consulta deixa de ser correcta. Deixa que la subconsulta el calculi.
  • 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.

Tornar al problema