[Solucionado]Dudas Sql subconsultas relacionando varias tablas

Iniciado por Anonymous250, 19 Diciembre 2011, 10:26 AM

0 Miembros y 1 Visitante están viendo este tema.

Anonymous250

Bueno vereis se me dan las consultas que son de 1 sola tabla,pero las que implican sacar datos de dos tablas poniendo requisitos esas no,nose como hacerlas y estoy un poco frustado,ya que tengo que hacer unas 90 consultas y la mayoria son subconsultas :huh:
Consultas de este estilo
Varias tablas ,una llamada equipos, otra ciclista,otra puertos,otra malliots,otra llevar y otra etapas

Obtener el nombre y el director de los equipos tales que todos sus ciclistas son mayores de 20 años.

Obtener el valor del atributo netapa de aquellas etapas tales que todos los puertos que estan en ellas tienen mas de 700 metros de altura.

Obetener el nombre de los ciclistas que han ganado todos los puertos de una etapa y ademas han ganado esa misma etapa.

Obtener el nombre de los equipos tales que todos sus corredores han llevado algun malliot o han ganado algun puerto.

Obtener el nombre de los equipos tal que sus ciclistas solo hayan ganado puertos de la 1 categoria.

El caso es que nose hacer la consulta con varios select creo que era
Domino mas o menos los :

  • Where
  • Or
  • Gruop by
  • from
  • Min
  • Max


adastra

No se cual es el modelo de datos que tienes, mencionas las tablas pero no especificas los tipos de relaciones que tienen ni su cardinalidad, sin embargo las consultas que indicas son básicas en cualquier sistema que maneje tablas en SQL, creo que tienes que aprender SQL básico antes de comenzar ejecutar consultas.

http://es.scribd.com/doc/1555902/Tutorial-SQL-basico


Saberuneko

#2
En caso de que tengas un campo clave que una tabla con otra (por ejemplo, el mismo nombre de ciclista en las dos tablas) puedes hacer una unión de tablas, metiendo una condición que te quedaría tal que así:

Suponiendo dos tablas llamadas A y B, ambas teniendo un campo llamado nombre que utilizaremos para unir ambas tablas.

SELECT nombre, <otros campos>
FROM A, B
WHERE A.nombre = B.nombre
AND <otras condiciones o subconsultas>


Ese WHERE A.nombre = B.nombre es una condición que evita que salgan duplicados los datos de las dos tablas, sólo mostrando cada nombre una vez (cuando coinciden el nombre de la tabla A con el nombre de la tabla B)

Si nos pasas el modelo de datos, te podremos orientar un poco mejor.

Un saludo.

Anonymous250

Ok pondre como estan las tablas ,para que las veais,pero no se ven las relaciones,me las an dao en papel,y e de escanearlo.
El caso es que tengo que entregar unas 90 consultas SQL,y la unica manera que se me ocurre de lograrlo es ponerme 5 dias o mas,las 24 horas,  a estudiar a saco consultas,y ir provandolas viendo que funcionan para ver que estan bien.
No es nada del otro mundo,lo que pasa es que bases de datos,se me da bien hasta cierto punto,pero la verdad es que tengo poca seguridad en mi mismo,con subconsultas.

Por cierto adastra mire el tuto que me pasastes asi por encima,gracias,me lo estudiare.
En 1 o 2 dias escaneare eso y lo pongo aqui.
Saludos.



Hadess_inf

Lo mejor que puedes hacer es usar INNER JOIN y LEFT OUTER JOIN para unir tus tablas.

Anonymous250

#5
Bueno estoy intentando hacer subconsultas,y las faciles,no tengo muchas complicacion pero cuando empiezan a pedir muchos requisitos me hago un lio,por  ejemplo.

Tres tablas

Tabla Empleado:
CREATE TABLE EMPLEADO (
ID NUMBER(10) NOT NULL,
NOMBRE VARCHAR2(30),
APELLIDOS VARCHAR2(60),
CARGO VARCHAR2(20),
JEFE_ID NUMBER(10),
FECHA_ALTA DATE,
SUELDO NUMBER(9,2),
COMISION NUMBER(9,2),
DEPARTAMENTO_ID NUMBER(10) NOT NULL,
CONSTRAINT EMPLEADOS_PK
PRIMARY KEY (ID)
USING INDEX);
Tabla Departamento:
CREATE TABLE DEPARTAMENTO (
ID NUMBER(10) NOT NULL,
NOMBRE VARCHAR2(50),
LOCALIDAD VARCHAR2(50),
CONSTRAINT DEPARTAMENTOS_PK
PRIMARY KEY (ID)
USING INDEX);
Tabla Rango_Sueldo:
CREATE TABLE RANGO_SUELDO (
GRADO NUMBER(2),
SUELDO_MIN NUMBER(9,2),
SUELDO_MAX NUMBER(9,2));


Y esta consulta:
Obtener el nonbre del departamento,y el numero de empleados que tiene.
El nombre del departamento da igual,puede ser informatica,prensa,etc

Lo que tiene que hacer la consulta es relacionar la tabla de empleado con la de departamento,haciendo un count entre los empleados cuyo departament_id sean iguales ,los que sean iguales que los cuente y esa cuenta la ponga al lado del nombre del departamento.

Esta claro que aun nose que hace cada cosa bien,por que si lo supiese sabria que poner en este caso y no me aria un lio.
E pensado,pero no doy con la consulta, puede que sea una subconsulta donde haya un count,un having o un where. Del inner join y out join se me dan fatal aun no les e cojido el trankillo,a los alias si. As.

Se que esta mal,pero e intentado algo asi,es que soy un poco corto de mente

SELECT nombre,Count(distinct departament_id) As numero empleados
From empleado,departamento
Where departament_id =
En fin creo que voy a suspender,estas son las faciles a las difiles no e llegado aun..... :-\

‭lipman

#6
Este miércoles tengo yo el examen final de BBDD precisamente xD

Código (sql) [Seleccionar]
SELECT Departamento.nombre, COUNT(*) FROM Empleado JOIN Departamento
ON(Departamento.Departamento_ID=Empleado.ID) GROUP BY Departamento.nombre


Deberia de ser así, aunque no me gusta tener que usar tanto el "." para identificar la tabla.. si es para estudiar y hacer ejercicios, me sorprende que te lien con tanto nombre igual.

Si no lo ves muy claro, haz primero esto:

Código (sql) [Seleccionar]
SELECT * FROM Empleado JOIN Departamento
ON(Departamento.Departamento_ID=Empleado.ID)


Y fíjate que puedes hacer grupos con los nombres de los departamentos, ya que estarán repetidos (una vez por cada empleado). Entonces simplemente los agrupas, y sacas el nombre y el count(*).

Un saludo.

Anonymous250

Hoy me e puesto a hacer consultas,me han ayudado ,y la verdad que no uso el INNER JOIN ni el OUT JOIN

E estado un par de horas para 29 consultas.......e terminado con dolor de cabeza  :xD y desorientacion.

Me han quedado unas 4 consultas o 5 sin hacer a ver si alguno me aconseja.Y la tabla Rango_sueldos,no establesco la relacion.Son las siguientes:

Obtener el nombre de los comerciales, la comisión, el sueldo mensual y el sueldo incrementado como sigue: si la comisión es menor que 50 €, aumentar un 25%; y si es igual o superior, aumentar un 12%.

Mostrar la localidad, nombre y sueldo del empleado cuyo grado es 2 o 3.

Obtener los departamentos sin empleados.

De los departamentos que tienen empleados, obtener el identificador del departamento, el sueldo máximo y el nombre del departamento.

Saludos

‭lipman

#8
Si te siguen faltando esas consultas, luego me pondré a ellas que tendré que hacer repaso de BBDD, pero eso si, aprovecho para preguntarte algo.

Cuando estás estudiando BBDD simplemente estudias con el código que has puesto? No tienes más código (INSERTs por ejemplo, para que puedas ver si es más gráfico).

Un saludo

Edito: La de "Departamentos sin empleados" es facil.
Departamentos sin empleados = Departamentos - Departamentos con empleados:

Código (sql) [Seleccionar]
SELECT nombre FROM Departamento
EXCEPT
SELECT Departamento.nombre FROM Departamento JOIN Empleado ON(Empleado.Departamento_ID=Departament.Id)

Anonymous250

#9
Cita de: lipman en  7 Enero 2012, 11:52 AM
Si te siguen faltando esas consultas, luego me pondré a ellas que tendré que hacer repaso de BBDD, pero eso si, aprovecho para preguntarte algo.

Cuando estás estudiando BBDD simplemente estudias con el código que has puesto? No tienes más código (INSERTs por ejemplo, para que puedas ver si es más gráfico).

Un saludo

Edito: La de "Departamentos sin empleados" es facil.
Departamentos sin empleados = Departamentos - Departamentos con empleados:

Código (sql) [Seleccionar]
SELECT nombre FROM Departamento
EXCEPT
SELECT Departamento.nombre FROM Departamento JOIN Empleado ON(Empleado.Departamento_ID=Departament.Id)

Bueno nunca habia visto el EXCEPT ,creo que estoy utilizando el where not exitst y el Where not in.Subconsultas de hasta 4 SElECT Con un monton con and y or.......El caso es que a mi en clase me enseñaron super poco no entiendo como me mandan esta base de datos que se complica un montonazo,creo que el examen lo hicieron mas facil de lo que era,por que el ejercicio que estoy haciendo yo no lo hico de 30 personas nadie.
Y bueno sobre mis avances e de decir que e compredido mejor lo de las subconsultas y comparaciones,mi hermano me esta ayudando y van saliendo.
Lo que pasa que si son muy dificiles y implican 4 tablas por ejemplo,buff ahi que pensar un monton la clave son las relaciones.me quedan unas 35 consultas para terminar los ejercicios,espero que salgan a ver,culkier duda la pongo aki ok.
Saludos y gracias.