SQL: TENER versus DÓNDE

Resuelto Adam Sh asked hace 12 años • 9 respuestas

Tengo las siguientes dos tablas:

1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).

Quiero encontrar al profesor con mayor especialización. Cuando intento esto, no funciona:

SELECT
  L.LectID, 
  Fname, 
  Lname 
FROM Lecturers L, 
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);

Pero cuando intento esto, funciona:

SELECT
  L.LectID,
  Fname,
  Lname 
FROM Lecturers L,
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
         Fname,
         Lname 
HAVING COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID); 

¿Cuál es la razón? Gracias.

Adam Sh avatar Feb 13 '12 05:02 Adam Sh
Aceptado

WHERELa cláusula introduce una condición en filas individuales ; HAVINGLa cláusula introduce una condición sobre las agregaciones , es decir, los resultados de la selección en los que se ha producido un único resultado, como recuento, promedio, mínimo, máximo o suma, a partir de varias filas. Su consulta requiere un segundo tipo de condición (es decir, una condición en una agregación), por lo que HAVINGfunciona correctamente.

Como regla general, úselo WHEREantes GROUP BYy HAVINGdespués GROUP BY. Es una regla bastante primitiva, pero útil en más del 90% de los casos.

Mientras lo hace, es posible que desee volver a escribir su consulta utilizando la versión ANSI de la unión:

SELECT  L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON L.LectID=S.LectID
GROUP BY L.LectID, Fname, Lname
HAVING COUNT(S.Expertise)>=ALL
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)

Esto eliminaría WHEREla que se utilizó como condición de unión theta .

Sergey Kalinichenko avatar Feb 12 '2012 22:02 Sergey Kalinichenko

Primero debemos conocer el orden de ejecución de las Cláusulas, es decir, DESDE > DÓNDE > GROUP BY > HAVING > DISTINCT > SELECT > ORDER BY. Dado que la cláusula WHERE se ejecuta antes que la cláusula GROUP BY, los registros no se pueden filtrar aplicando WHERE a los registros aplicados GROUP BY .

"HAVING es igual que la cláusula WHERE pero se aplica a registros agrupados".

Primero, la cláusula WHERE recupera los registros según la condición, luego la cláusula GROUP BY los agrupa en consecuencia y luego la cláusula HAVING recupera los registros del grupo según la condición de tener.

Pardhu avatar Mar 27 '2017 13:03 Pardhu