Ayuda con una Select en SQL

Buenas :)

Para que os voy a engañar... Necesito ayuda con una práctica de clase. Tengo que hacer varias consultas sobre unas tablas y no consigo sacarlas :s

La consulta en cuestión es la siguiente:

Mostrar la siguiente información del personaje con más munición: nombre y apellidos, seudónimo, altura, ancho y cantidad de munición.

Sé que tengo que utilizar la función max() para seleccionar el valor con mayor munición, pero para obtener todos los datos tengo que meter mano en 3 tablas, y es ahí donde me pierdo, en el camino entre el max y saber a quien corresponde ese valor :s

Os dejo aqui pegadas las tablas a las que hay que acceder y si alguno quiere, os puedo pegar también alguna inserción para probarlo.

CREATE TABLE ARMAS
   ( Nombre_armas   varchar2(25) not null,
     Daño      numeric(2) not null,
     Tasa      numeric(2) not null,
     Municion   numeric(3) not null,
     CONSTRAINT PKARMAS PRIMARY KEY (Nombre_armas));


CREATE TABLE TIENE
   ( Pseudonimo   varchar2(35) not null,
     Nombre_armas   varchar2(25) not null,
     CONSTRAINT PKTIENE PRIMARY KEY (Pseudonimo,Nombre_armas),
     CONSTRAINT FK1TIENE FOREIGN KEY (Pseudonimo) REFERENCES MALOS (Pseudonimo) ON DELETE CASCADE,
     CONSTRAINT FK2TIENE FOREIGN KEY (Nombre_armas) REFERENCES ARMAS (Nombre_armas) ON DELETE CASCADE);



CREATE TABLE MALOS
   ( Nombre    varchar2(30) not null,
     Apellidos   varchar2(35) not null,
     Pseudonimo   varchar2(35) not null,
     Edad      numeric(3) not null,
     Sexo      char(5)   not null,
     Altura   numeric(3) not null,
     Ancho      numeric(4) not null,
     Morfologia   varchar2(12),
     Color_pelo    varchar2(10),
     Cod_traje      numeric(3),
     CONSTRAINT PKMALOS PRIMARY KEY (Pseudonimo),
     CONSTRAINT FKMALOS FOREIGN KEY (Cod_traje) REFERENCES TRAJES (Cod_traje) ON DELETE SET NULL,
     CHECK ((Ancho>-101) AND (Ancho<101)));



Si necesitais alguna aclaración de algo que no se entienda, preguntadme y... Gracias !

(:
Bueno,
Este no deberia ser (de hecho no lo es XD) el lugar mas indicado para hacer este tipo de preguntas, ademas, no aprenderas si no te pones a practicar, sobre todo no has puesto ni siquiera un ejemplo de tu intento de sacar la informacion, solo dices que te pierdes en el intento, pero donde esta el intento???

Despues de darte ese pequeño sermon y despues de tranquilizarme ( [fumando] ) un poco y ya que has sido muy sincero, desde el principio aclaraste para que querias la consulta, te voy a echar una mano.

OJO: no soy experto ni mucho menos en SQL, ademas hace una pila de años que no realizo una consulta por lo que mi respuesta puede estar completamente erronea (pero por lo menos la logica es la que debes guiarte); tambien agrego que errores de sintaxis mi respuesta debe tener muchos, pero aqui va (tu consulta deberia parecerse mas o menos a esta):

SELECT    m.nombre, m.apellidos, m.pseudonimo, m.altura, m.ancho, a.municion
FROM      MALOS m, ARMAS a, TIENE t
WHERE     a.municion = (SELECT MAX(municion) from ARMAS) AND
          a.nombre_armas = t.nombre_armas AND
          t.pseudonimo = m.pseudonimo


PD: el sermon era de coña xDDDDDD pero es cierto, aprenderas mas facil si lo intentas!!!!!!!!

Saludos...
Bueno, lo primero es, que muchas gracias por tu ayuda, no tenias ni errores de sintaxis y la select funciona perfectamente :)


Y por otro lado... Ya se que si no me pongo a practicar yo no aprenderé, pero creeme que después de 5 prácticas de bases de datos este cuatrimestre he aprendido xD. Esta consulta, después de echarle tiempo, se me resistia (junto con otra más, pero tampoco quería abusar xDD) y entre que tenía que empezar a estudiar ya.. Pues busqué ayuda ^^

Mi intento no lo puse para no condicionar la respuesta de nadie, pero ahora que ya está la solución, te pongo lo que hice yo para que te quedes mas tranquilo [sonrisa] :


SELECT * FROM
   (SELECT * FROM
      (((SELECT nombre_arma,municion FROM ARMA) A
      JOIN EQUIPO ON A.nombre_arma=EQUIPO.nombre_arma) B
      JOIN (SELECT nombre,apellidos,pseudonimo,altura,ancho, FROM PERSONAJE) C ON B.seudonimo=C.seudonimo)
      ORDER BY municion DESC)
   WHERE ROWNUM=1;


La idea de usar los Join's es porque las tablas intermedias creadas son mucho mas pequeñas que las que se crean con la intereseccion total de plantar las 3 tablas a pelo (Aunque llegados a este punto, la optimización... me la pela un poco xD). Luego en vez de usar la función max, habia ordenado la munición descendiente y cogía la primera tupla.

La verdad esque salió algo lioso.. También probé a hacerlo con la función max(), pero mas de lo mismo... [+risas]


En fin, que me enrollo mucho. Muchisisimas gracias ! [beer]
Que bueno saber que te funciono a la primera XD (jajajaja no estoy tan oxidado como creia jajajaja)

A lo de mi sermon no le des tanta mente que es que cuando no me he tomado mi medicina ( [fumando] ) me pongo un poco en plan de padre responsable-sermonero [plas] [qmparto]
Nah, no te preocupes porque es la verdad. Si no se pone uno mismo, no terminas aprendiendo nada.

Y para que veas que me has ayudado de verdad, después de ver que tu select funcionaba bien, me puse a hacer la otra que se me resistia y... la hice en un ratejo ! xDD.
teoricamente el inner join es mas optimo que utilizar el tipico "dni.estudiante=dni.matriculados" no???

Esque eso me dijo la profesora pero leyendo por la red la jente afirma que la optimizacion es similar en mysql que ninguno va mas rapido o consume menos que otro y no me lo termino de creer [+risas] [+risas] [+risas]


Lo mas facil sin duda es el X.a = X.b pero teoricamente lo menos optimo y lo que deberia usarse son los join (Ojo para tablas con muchos campos, si es una tabla con 4 campos mataos no vas a notar diferencia alguna)...

Por cierto que estas estudiando exactament =D ??
Lo digo porque yo tb estoy dando BDO jejeje pero yo toy en 2año de grado medio...
klausus escribió:teoricamente el inner join es mas optimo que utilizar el tipico "dni.estudiante=dni.matriculados" no???

Esque eso me dijo la profesora pero leyendo por la red la jente afirma que la optimizacion es similar en mysql que ninguno va mas rapido o consume menos que otro y no me lo termino de creer [+risas] [+risas] [+risas]


Lo mas facil sin duda es el X.a = X.b pero teoricamente lo menos optimo y lo que deberia usarse son los join (Ojo para tablas con muchos campos, si es una tabla con 4 campos mataos no vas a notar diferencia alguna)...

Por cierto que estas estudiando exactament =D ??
Lo digo porque yo tb estoy dando BDO jejeje pero yo toy en 2año de grado medio...


es lo mismo un join que un where tabla1.campo=tabla2.campo solo que el join es de la norma sql92 antes habia que hacerlo a base de wheres el sgbd lo va a tratar exactamente igual.
6 respuestas