none
Ayuda con un trabajo porfavor. RRS feed

  • Pregunta

  • Hola buenas tardes. Soy estudiante de Desarrollo de aplicaciones web a distancia, y normalmente no tengo problema alguno para realizar los trabajos que me mandan, pero esta vez, los apuntes son de chiste.

    Tengo que hacer un trabajo sobre consultas en una base de datos SQL y hay una de las preguntas que no se ni por donde empezar.

    Es la siguiente: Muestra el nombre y los apellidos de los mineros que tengan el mismo nombre que algún ingeniero.

    Como tablas referentes a estos datos tengo: Compañia(NIF, nombreCompañia, telefono), Contrato(NIF, DNI, fechaInicio, fechaFin)

    Empleado(DNI, nombre, apellido1, apellido2), Ingeniero(DNI, fechaFinCarrera), Minero(DNI, fechaMinero).

    No tengo ni idea de como empezar, si alguien puede orientarme un poco se lo agradeceria muchisimo.

    Un saludo.

    Raquel

    lunes, 16 de abril de 2018 12:05

Respuestas

  • Hola Raquel2710:

    La opción que te puse en el IN es una subconsulta.

    SELECT E.NOMBRE, E.APELLIDO1 FROM EMPLEADO E INNER JOIN MINERO M ON E.DNI = M.DNI
    WHERE E.NOMBRE IN /*dentro del in la subconsulta */
    (SELECT NOMBRE FROM EMPLEADO E INNER JOIN INGENIERO I ON E.DNI = I.DNI)


    Saludos

    • Marcado como respuesta Raquel2710 lunes, 16 de abril de 2018 14:51
    lunes, 16 de abril de 2018 14:21

Todas las respuestas

  • Hola:

    Puedes empezar con esto. Mismo nombre que algun ingeniero.

    Select mis campos FROM EMPLEADO AS E

    Where campoclave IN (Select campoclave from EMPELEADOS WHERE lo que identifica a un ingeniero)

    Esta es una de las posibilidades.

    Saludos

    lunes, 16 de abril de 2018 12:27
  • Lo veo un poco mas claro, pero sigo perdidisima.

    No se como solucionar el ejercicio.

    lunes, 16 de abril de 2018 13:47
  • Hola Raquel:

    Esta sería una solución a tu planteamiento.

    CREATE TABLE COMPANY (NIF VARCHAR(15) PRIMARY KEY, NOMBRECIA VARCHAR(100), TELEFONO VARCHAR(15))
    GO
    
    CREATE TABLE CONTRATO (NIF VARCHAR(15), DNI VARCHAR(10) /* */
    , FECHAINICIO DATE, FECHAFIN DATE, PRIMARY KEY (NIF, DNI))
    GO
    CREATE TABLE EMPLEADO (DNI VARCHAR(15), NOMBRE VARCHAR(10), APELLIDO1 VARCHAR(10), APELLIDO2 VARCHAR(10))
    GO
    CREATE TABLE INGENIERO (DNI VARCHAR(15), FECHAFINCARRERA DATE)
    GO
    CREATE TABLE MINERO (DNI VARCHAR(15), FECHAMINERO DATE)
    GO
    INSERT INTO COMPANY(NIF, NOMBRECIA, TELEFONO)VALUES ('1000', 'EMPRESA PRINCIPAL', '9000200000'), ('1001', 'EMPRESA FICTICIA','900010000')
    GO
    
    INSERT INTO CONTRATO (NIF, DNI) VALUES ('1000' /*REFERIDO A LA COMPAÑIA */
    ,'2000') /*REFERIDO AL EMPLEADO */ 
    ,('1000','2001'),('1000','2003')
    GO
    
    INSERT INTO EMPLEADO (DNI, NOMBRE, APELLIDO1, APELLIDO2 ) VALUES ('2000', 'ANA','ALVAREZ','GARCIA'),('2001','PEDRO','GARCIA','CLAVERO')
    ,('2003','ANA','PICAPIEDRA','MARTINEZ')
    GO
    INSERT INTO INGENIERO VALUES ('2000','20170425')
    GO
    INSERT INTO MINERO VALUES ('2001','20140523')
    INSERT INTO MINERO VALUES ('2003','20150421')
    GO
    
    SELECT * FROM EMPLEADO
    SELECT * FROM COMPANY
    SELECT * FROM INGENIERO 
    SELECT * FROM MINERO
    
    SELECT E.NOMBRE, E.APELLIDO1 FROM EMPLEADO E INNER JOIN MINERO M ON E.DNI = M.DNI
    WHERE E.NOMBRE IN 
    (SELECT NOMBRE FROM EMPLEADO E INNER JOIN INGENIERO I ON E.DNI = I.DNI)

    Como observarás y siempre es la manera más facil, primero create las tablas y alimentalas con datos, luego busca como conectar tabla con tabla, por los campos clave si se puede.

    Una vez tienes las tablas conectadas, en este caso, buscas las columnas a mostrar donde se cumpla una condición. y cual es la condicion (una subconsulta).

    Espero te haya aclarado un poco la duda de los apuntes.

    A veces los datos, según los vas creando tienen algo de sentido. (Pero solo algo :) )

    Un saludo

    lunes, 16 de abril de 2018 14:11
  • Hola Javi!

    Si, eso ya se me habia ocurrido pero el ejercicio tienes que ser desde subconsultas.

    Estos profesores que les gusta mucho complicar las cosas.

    He conseguido que me muestre los nombres de los ingenieros y de los mineros, 

    pero estoy estancada ahi.

    No se como hacer para que me compare los nombres. 

    Tengo esto (Esta en catalan pero no es muy complicado de entender):

    SELECT concat(nom,' ',cognom1,' ',cognom2) as Nom

    FROM empleat 

    WHERE dni IN (SELECT nom FROM enginyer WHERE anyFiCarrera)

    UNION

    SELECT concat(nom,' ',cognom1,' ',cognom2) as Nom

    FROM empleat 

    WHERE dni IN (SELECT nom FROM minaire WHERE dataMinaire)

    lunes, 16 de abril de 2018 14:14
  • Hola Raquel2710:

    La opción que te puse en el IN es una subconsulta.

    SELECT E.NOMBRE, E.APELLIDO1 FROM EMPLEADO E INNER JOIN MINERO M ON E.DNI = M.DNI
    WHERE E.NOMBRE IN /*dentro del in la subconsulta */
    (SELECT NOMBRE FROM EMPLEADO E INNER JOIN INGENIERO I ON E.DNI = I.DNI)


    Saludos

    • Marcado como respuesta Raquel2710 lunes, 16 de abril de 2018 14:51
    lunes, 16 de abril de 2018 14:21
  • Genial Javi! Eso es justo lo que pide.

    Pero sinceramente no entiendo nada de el proceso, si pudieses explicarmelo para entenderlo te alo agradeceria muchisimo!

    Muchisimas gracias.

    Raquel

    lunes, 16 de abril de 2018 14:40
  • Si te lo explico detalladamente por la noche, que ahora me tengo que pirar....
    lunes, 16 de abril de 2018 14:57
  • Hola Raquel.

    Te voy a explicar el como lo hice, desde la propia sentencia linea por linea.

    CREATE TABLE COMPANY (NIF VARCHAR(15) PRIMARY KEY, NOMBRECIA VARCHAR(100), TELEFONO VARCHAR(15)) 
    /* Creacion de la tabla compañia, la unica causistica especial, es que utiliza como clave primaria el NIF */
    CREATE TABLE CONTRATO (NIF VARCHAR(15), DNI VARCHAR(10), FECHAINICIO DATE, FECHAFIN DATE, PRIMARY KEY (NIF, DNI))
    /* Creacion de la tabla contrato, que es una tabla, que te dará trabajo porque claramente esta concebida para una relacion de muchos a muchos 
    como ves, el nif, encaja con company, y el dni, con el resto de las tablas, por tanto probablemente con este esquema te manden ejercicios N a M
    */
    CREATE TABLE EMPLEADO (DNI VARCHAR(15), NOMBRE VARCHAR(10), APELLIDO1 VARCHAR(10), APELLIDO2 VARCHAR(10))
    /* Tabla empleado cuya clave primaria será (yo no lo hice, pero se debiera) DNI */
    CREATE TABLE INGENIERO (DNI VARCHAR(15), FECHAFINCARRERA DATE)
    /* Tabla Ingeniero, cuya clave primaria debiera de ser DNI, por tanto cuando insertes un empleado insertarás un registro en ingeniero si lo fuese */
    CREATE TABLE MINERO (DNI VARCHAR(15), FECHAMINERO DATE)
    /* Tabla Minero, cuya clave primaria debiera de ser DNI, por tanto cuando insertes  un empleado insertarás un registro en minero si lo fuese */
    INSERT INTO COMPANY(NIF, NOMBRECIA, TELEFONO)VALUES ('1000', 'EMPRESA PRINCIPAL', '9000200000'), ('1001', 'EMPRESA FICTICIA','900010000')
    /* CREAMOS DOS COMPAÑIAS */
    
    INSERT INTO CONTRATO (NIF, DNI) VALUES ('1000' /*REFERIDO A LA COMPAÑIA */
    ,'2000') /*REFERIDO AL EMPLEADO */ 
    ,('1000','2001'),('1000','2003')
    /* AQUI SE INSERTAN TRES CONTRATOS, DE LA COMPAÑIA UNO PARA LOS TRES EMPLEADOS QUE SE CREAN DESPUES. ....
    COMO VES LOS IDENTIFICADORES, SON NIF Y DNI, EL 1000 ES EL NIF DE LA CIA PRINCIPAL, Y LOS DNI 2000, 2001 Y 2003 LOS DE LOS EMPLEADOS
    */
    
    INSERT INTO EMPLEADO (DNI, NOMBRE, APELLIDO1, APELLIDO2 ) VALUES ('2000', 'ANA','ALVAREZ','GARCIA'),('2001','PEDRO','GARCIA','CLAVERO')
    ,('2003','ANA','PICAPIEDRA','MARTINEZ')
    /* INSERTO TRES EMPLEADOS CON DNI 2000, 2001, Y 2003*/
    
    INSERT INTO INGENIERO VALUES ('2000','20170425')
    /* AL EMPLEADO 2000 LO HAGO INGENIERO */
    INSERT INTO MINERO VALUES ('2001','20140523')
    INSERT INTO MINERO VALUES ('2003','20150421')
    /* A LOS 2001 Y 2003 LOS HAGO MINEROS */
    
    SELECT * FROM EMPLEADO
    SELECT * FROM COMPANY
    SELECT * FROM INGENIERO 
    SELECT * FROM MINERO
    /* VISUALIZO LAS INSERCCIONES. */
    SELECT E.NOMBRE, E.APELLIDO1 FROM EMPLEADO E INNER JOIN MINERO M ON E.DNI = M.DNI
    /* LA SELECT LA HAGO SOBRE LA TABLA EMPLEADOS Y CON UNA RELACION DIRECTA DONDE SOLO APARECEN LOS EMPLEADOS QUE ESTEN EN LA TABLA MINEROS.
    PORQUE SI TE FIJAS, NO MENCIONO LA TABLA M, EN NINGUNA COLUMNA DE LA SELECT
    ASÍ ME QUITO DE ENCIMA YA LOS QUE NO SEAN MINEROS */
    
    WHERE
    	 E.NOMBRE IN  /* PERO DE TODOS LOS EMPLEADOS MINEROS, SOLO QUIERO LOS QUE SU NOMBRE ESTE EN LA LISTA DE RESULTADOS QUE DEVUELVA */
    (
    	SELECT NOMBRE FROM EMPLEADO E INNER JOIN INGENIERO I ON E.DNI = I.DNI /* LOS RESULTADOS DE ESTA SUBCONSULTA, QUE SON TODOS LOS EMPLEADOS
    	QUE TIENEN QUE SER INGENIEROS, Y DE ELLOS SOLO OBTENGO SU NOMBRE*/
    )
    

    Espero te sirva de ayuda

    Saludos

    lunes, 16 de abril de 2018 18:00
  • ¿Que hay de eso que el IN fue substituido por el EXISTS?

    Yo he probado con algunos cuantos miles de registros y siempre el IN es mucho menos eficiente que el EXISTS

    Saludos (gracias por cualquier comentario al respecto)

    lunes, 16 de abril de 2018 18:12
  • Hola iislas:

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/in-transact-sql

    No, In es completamente valido, no ha sido sustituido y esto es para un simple ejercicio, a mi modo de ver, es mucho más claro, aunque solo sea semánticamente, y da más juego.

    Si es cierto que Exists tiene o puede tener, un mejor rendimiento que IN, normalmente. Pero en una consulta de no se....10.000, 100.000, varios millones, donde puedas observar una mejora, y si nos ponemos a refinar, seguro que hay muchos aspectos más refinables, como por ejemplo usar una subconsulta, pero son las cosas que mandan para los ejercicios, y para las cuales hay que jugar con cosas típicas de ejercicios. Cuando en el cole te mandaban esto, nadie te había explicado lo que era un plan de ejecución (supongo).

    Según la documentación existe, funciona genial y yo de momento, lo utilizo.

    Gracias por el aporte.

    lunes, 16 de abril de 2018 18:50
  • Gracias por el comentario, para tomarse en cuenta
    lunes, 16 de abril de 2018 20:47