Ver Mensaje Individual
  #4 (permalink)  
Antiguo 31/10/2014, 06:06
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema codigo

Bueno, ahora queda más claro lo que sucede...

El SQL, en todos los DBMS (incluyendo Oracle), tiene ciertas reglas generales. Una de ellas expresa que no se pueden poner cláusulas agrupadas como MAX() en el WHERE, porque el WHERE aplica sobre cada registro que se lee, mientras que las clausulas agrupadas lo hacen sobre grupos de registros.
Para aplicar algo que corresponda a un grupo, pero se valide contra cada uno de los registros devueltos, se usa HAVING, al final de la query.
De todos modos lo que estás planteando en esa consulta es que te devuelva sólo aquellos registros donde el valor del crédito sea igual al máximo que exista en la tabla. Eso podría devolverte, dado el caso, un único registro. ¿Lo has tenido en cuenta? Es decir, no devolvería un grupo de los mayores valores, sino sólo aquellos que sean iguales al mayor de todos.
¿Es eso lo que quieres?
Bueno, eso sería mas o menos así:
Código SQL:
Ver original
  1. SELECT nom, credits
  2. FROM TBLassignatures
  3. HAVING credits = MAX(credits)
que también se puede escribir:
Código SQL:
Ver original
  1. SELECT nom, credits
  2. FROM TBLassignatures
  3. WHERE credits = (SELECT MAX(credits) FROM TBLassignatures)
Este ultimo caso no viola lo antedicho porque la subconsulta se ejecuta una vez por cada registro leído, cumpliendo con la restricción. De todos modos resulta algo ineficiente.

Si la restricción de ser iguales al máximo valor no es necesaria, y quieres por ejemplo los 3 registros de mayor credito, sería así:

Código SQL:
Ver original
  1. SELECT nom, credits
  2. FROM TBLassignatures
  3. WHERE ROWNUM < 4
  4. ORDER BY credits DESC, nom ASC

Te conviene leer en detalle las restricciones del uso de las funciones y un buen manual de SQL para Oracle. Remarco esto último porque hay diferencias entre este DBMS y los demás en algunas cosas, por lo que ciertos ejemplos que encontrarás en tutoriales de SQL en generl, no se aplican bien en Oracle, o MySQL, o incluso en SQL Server.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)