Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

[SOLUCIONADO] Problema codigo

Estas en el tema de Problema codigo en el foro de Oracle en Foros del Web. Hola tengo esta tabla @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original CREATE TABLE TBLassignatures ( idAssignatura varchar2 ( 6 ) PRIMARY KEY , Nom varchar2 ( ...
  #1 (permalink)  
Antiguo 31/10/2014, 05:21
 
Fecha de Ingreso: octubre-2014
Mensajes: 17
Antigüedad: 9 años, 6 meses
Puntos: 0
Problema codigo

Hola tengo esta tabla


Código SQL:
Ver original
  1. CREATE TABLE TBLassignatures
  2. (
  3. idAssignatura varchar2 (6)PRIMARY KEY,
  4. Nom varchar2(50)NOT NULL,
  5. Credits FLOAT NULL,
  6. Quatrimestre varchar2(1),
  7. CostBase FLOAT NULL,
  8. IdProfessor varchar2(4)NULL,
  9. Idtitulacio varchar2 (6),
  10. Curs varchar2(1) NULL
y estos inserts
Código SQL:
Ver original
  1. INSERT INTO TBLAssignatures(IdAssignatura, Nom, Credits, Quatrimestre, CostBase, IdProfessor, IdTitulacio, Curs)
  2.   VALUES('000115', 'Programació de Bases de Dades', 4.5, 1, 30.00, 'P204',NULL,NULL);
  3. INSERT INTO TBLAssignatures(IdAssignatura, Nom, Credits, Quatrimestre, CostBase, IdProfessor, IdTitulacio, Curs)
  4.   VALUES('130113', 'Programació I', 9, 1, 60.00, 'P101','130110','1');
  5. INSERT INTO TBLAssignatures(IdAssignatura, Nom, Credits, Quatrimestre, CostBase, IdProfessor, IdTitulacio, Curs)
  6.   VALUES('130122', 'Anàlisi II', 9, 2, 60.00, 'P203','130110','2');
  7. INSERT INTO TBLAssignatures(IdAssignatura, Nom, Credits, Quatrimestre, CostBase, IdProfessor, IdTitulacio, Curs)
  8.   VALUES('150212', 'BBDD', 4.5, 2, 70.00, 'P304','150210','1');
  9. INSERT INTO TBLAssignatures(IdAssignatura, Nom, Credits, Quatrimestre, CostBase, IdProfessor, IdTitulacio, Curs)
  10.   VALUES('160002', 'Contabilitat', 6, 1, 70.00, 'P117','160000','1');
necestio crear el código qe me devuelva el NOMBRE de las asignaturas que tengan más créditos, ya que no encuentro la manera de hacerlo. Gracias
  #2 (permalink)  
Antiguo 31/10/2014, 05:30
Avatar de 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

Cita:
necestio crear el código qe me devuelva el NOMBRE de las asignaturas que tengan más créditos, ya que no encuentro la manera de hacerlo.
Pues en la misma descripcion que mencionas está la solución: Necesitas hacer una consulta que te devuelva los N registros de las asignaturas, ordenados por créditos de mayor a menor.
La verdad es una consulta demasiado básica, de tutorial. ¿Has intentado hacerla?

Si intentaste algo, porstea lo hecho. Si te fallo y te dio un error, postea el error para saber cuál es el problema.

Fuera de eso, no se entiende cuál es la dificultad.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 31/10/2014, 05:40
 
Fecha de Ingreso: octubre-2014
Mensajes: 17
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problema codigo

pues esto es lo que he puesto:
Código SQL:
Ver original
  1. SELECT nom,credits
  2. FROM TBLassignatures
  3. WHERE credits=MAX(credits)

Última edición por gnzsoloyo; 31/10/2014 a las 05:57
  #4 (permalink)  
Antiguo 31/10/2014, 06:06
Avatar de 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)

Etiquetas: tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:07.