Ayuda con sentencias SQL

Buenas a tod@s! Me podriais echar un cable que tengo aquí un par de ejercicios que no me salen,llevo desde las 4 y no soy capaz y se me esta haciendo la cabeza un lio...

MEDICOS ( NCOL , NMEDI , ESPECI , FINGRESO , SUELDO , NCOLJEFE)

PACIENTES ( NHISTORIA , NIF , NOMPA , FECNA , EC)

ATIENDEN( NCOL , NHISTORIA,FECHAC )

----

MEDICOS : nº de colegiado (3 números y una letra),especialidad,fecha de ingreso ,sueldo,nº de colegiado que es su jefe.

PACIENTES : nº de historia (2letras y 4 números) ,NIF,nombre,fecha de nacimiento y estado civil.

ATIENDEN : nº de colegiado,nº de historia y fecha de consulta .Se guardan las consultas realizadas por médicos a pacientes.

____________________________________

1. Crea las relaciones (tablas) que figuran en el esquema de forma que cumplan las reglas del modelo relacional.

2. Se disminuye en 10€ el sueldo de los médicos que tengan el sueldo mas alto de su especialidad.

3. Nombre de las especialidades que tengan mas médicos que la especialidad de Pediatría o que la de Odontología. Ordenados alfabéticamente.

4. Partiendo de las relaciones (tablas) existentes,obtener una relación medicos2 con: nombre de medico,numero de colegiado y numero de consultas.

5. Por medico : nombre,especialidad y un texto que indique si tiene sueldo alto o bajo,según sea superior al sueldo medio de los médicos que tengan el mismo jefe.

6. Por cada paciente con menos de 3 consultas y que no sea casado ; nº de historia ,DNI y nº de consultas.

7. Un medico con nº de colegiado 7460 pasa a ser jefe de todos los médicos que tienen su especialidad y que ingresaron entre 1995 y 2000.

8. A día de hoy se incorpora un nuevo medico de la especialidad de Hematología : Pablo Suarez ,nº de colegiado 500,sueldo 1800€ y NIF 77777777H.


Seria el ejercicio 2º y el 7º.

Gracias [beer]
El 2º ahora mismo no me viene a la mente pero el 7º seria:

Update
  MEDICOS
Set
  NCOLJEFE = 7460
Where
  ESPECI In (Select ESPECI From MEDICOS Where NCOL = 7460) And
  FINGRESO Between ('01/01/1995' And '31/12/2000')


Saludos!
Instálate el Toad y ve probando a construir sentencias poco a poco, de nada te sirve que te las resuelvan aquí.
2. Se disminuye en 10€ el sueldo de los médicos que tengan el sueldo mas alto de su especialidad.


no lo he probado, pero creo que seria asi

Update
  MEDICOS
Set
  sueldo = sueldo - 10
Where
sueldo in (select max(sueldo) from medicos group by especi)
highfredo escribió:
2. Se disminuye en 10€ el sueldo de los médicos que tengan el sueldo mas alto de su especialidad.


no lo he probado, pero creo que seria asi

Update
  MEDICOS
Set
  sueldo = sueldo - 10
Where
sueldo in (select max(sueldo) from medicos group by especi)


Yo tampoco lo he probado, pero diría que está mal. El sueldo máximo de un medico puede ser el sueldo medio de otro, ahí estas haciendo un update sobre todos los medicos con un sueldo determinado.
Diría que falta volver a agrupar fuera por especi
Carlcox escribió:
highfredo escribió:
2. Se disminuye en 10€ el sueldo de los médicos que tengan el sueldo mas alto de su especialidad.


no lo he probado, pero creo que seria asi

Update
  MEDICOS
Set
  sueldo = sueldo - 10
Where
sueldo in (select max(sueldo) from medicos group by especi)


Yo tampoco lo he probado, pero diría que está mal. El sueldo máximo de un medico puede ser el sueldo medio de otro, ahí estas haciendo un update sobre todos los medicos con un sueldo determinado.
Diría que falta volver a agrupar fuera por especi


cierto.
pues entonces lo unico que se me ocurre es usar un cursor
Joder, el segundo es complicado. Voy a ver en los apuntes que tengo yo XD ¿Es para MYSQL?

Edit. Bueno, creo que es esto:

Update
  MEDICOS
Set
  sueldo = sueldo - 10
Where
NCOL in (
      SELECT NCOL
      FROM medicos
      GROUP BY  NCOL,especi
      HAVING MAX(sueldo) < 50000;
);


No sé si eso funciona. Es que sin una base de datos donde probar... es complicado.

O quizá esto:

Update
  MEDICOS
Set
  sueldo = sueldo - 10
Where
NCOL in (
      SELECT m.NCOL
      FROM medicos m, medicos p
      where m.especi=p.especi and  m.sueldo>p.sueldo
);


Que sean de la misma especialidad y que además tenga más sueldo que el resto. Lo mismo hay que poner >= en el condicional del sueldo.
En mysql no se si será igual, yo trabajo con plsql y creo que sería así:

UPDATE
   MEDICOS
SET
   SUELDO = SUELDO - 10
WHERE
   NCOL IN
( select NCOL from medicos MED where sueldo =
   (
      select max(sueldo) from medicos WHERE ESPECI = MED.ESPECI
   )
   GROUP BY ESPECI
)
7 respuestas