none
Problema con una query RRS feed

  • Pregunta

  • Estoy finalizando una Query pero tengo problemas al tener una de las tablas (SIBLING) clave compuesta,pongo la estructura de las tablas para que todo se vea mas claro.

     
    **child** 
    
        CREATE TABLE CHILD(
        child_id SMALLINT,
        child_name VARCHAR(255) NOT NULL,
        birth_date DATE NOT NULL,
        gender VARCHAR(255) NOT NULL,
        address VARCHAR(255),
        city VARCHAR(255),
        CONSTRAINT PK_CHILD PRIMARY KEY(child_id)
    
    **Sibling**
    
        CREATE TABLE SIBLING(
        child_id1 SMALLINT,
        child_id2 SMALLINT,
        CONSTRAINT PK_SIBLING PRIMARY KEY(child_id1, child_id2),
        CONSTRAINT CHILD1_FK FOREIGN KEY (child_id1) REFERENCES CHILD(child_id),
        CONSTRAINT CHILD2_FK FOREIGN KEY (child_id2) REFERENCES CHILD(child_id)
        );
    
    **letter**
    
        CREATE TABLE LETTER(
        letter_id SMALLINT,
        arrival_date DATE NOT NULL,
        number_toys INTEGER NOT NULL,
        delivery_mode VARCHAR(255) NOT NULL,
        child_id SMALLINT,
        CONSTRAINT PK_LETTER PRIMARY KEY(letter_id),
        CONSTRAINT CHILD_FK FOREIGN KEY (child_id) REFERENCES CHILD(child_id)
        );
    
      **wished_toy** 
    
         CREATE TABLE WISHED_TOY(
         letter_id SMALLINT,
         toy_id SMALLINT,
         CONSTRAINT PK_WISHED_TOY PRIMARY KEY(letter_id, toy_id),
         CONSTRAINT LETTER_FK FOREIGN KEY (letter_id) REFERENCES LETTER(letter_id)
         CONSTRAINT LETTER_FK FOREIGN KEY (toy_id) REFERENCES TOY(toy_id)
         );
    
    **toy**
    
        CREATE TABLE TOY(
        toy_id SMALLINT,
        toy_name VARCHAR (255) NOT NULL,
        price DECIMAL NOT NULL,
        toy_type VARCHAR(255) NOT NULL,
        manufacturer VARCHAR(255) NOT NULL,
        CONSTRAINT PK_TOY PRIMARY KEY(toy_id),
        );
    


    Se me pide una consulta que me saque la lista de niños(child) que han pedido un juguete que también pidiese su hermano(Sibling).Me piden su child_id,child_name y birth_date.

    Tengo ya parte de la consulta echa que me saca los jueguetes que han pedido cada niño y su hermano

        SELECT ch.child_id,ch.child_name,ch.birth_date,,wt.toy_id
        FROM child ch 
        right outer join sibling si ON ch.child_id= SI.child_id1
        left outer join letter l 
        on ch.child_id=l.child_id
        left outer join wished_toy wt on l.letter_id=wt.letter_id

    Esta query me saca el listado de los niños que son hermanos y los juegutes que han pedido,los hermanos son child_id (1,11) (6,10) (3,12) (8,13)

    **RESULT OF THE QUERY**
    
        1,    'Daniel'   ,'2005-05-01'   ,7
        1,    'Daniel'   ,'2005-05-01'   ,5
        1,    'Daniel'   ,'2005-05-01'   ,9
        1,    'Daniel'   ,'2005-05-01'   ,4
        1,    'Daniel'   ,'2005-05-01'   ,3
        1,    'Daniel'   ,'2005-05-01'   ,1
        11,   'Mireia'   ,'2009-06-10'   ,9
        11,   'Mireia'   ,'2009-06-10'   ,7
        11,   'Mireia'   ,'2009-06-10'   ,5
        11,   'Mireia'   ,'2009-06-10'   ,4
        11,   'Mireia'   ,'2009-06-10'   ,8
         6,    'Elena'   ,'2001-02-18'    ,5
        10,   'Guillermo','2003-12-21'   ,1
        10,   'Guillermo','2003-12-21'   ,4
        10,   'Guillermo','2003-12-21'   ,9
         3,    'Raquel'  ,'2002-03-08'    ,5
         3,    'Raquel'  ,'2002-03-08'    ,2
        12,   'Sergi'   ,'2012-08-29'   ,12
        12,   'Sergi'   ,'2012-08-29'    ,7
        12,   'Sergi'   ,'2012-08-29'    ,2
        12,   'Sergi'   ,'2012-08-29'    ,5
        8,    'Pedro'   ,'2008-03-30'    ,3
        8,    'Pedro'   ,'2008-03-30'    ,4
        8,    'Pedro'   ,'2008-03-30'    ,8
        13,   'Sara'    ,'2002-08-29',  NULL
    

    Por ejemplo se ve que el hermano 1 y 11 han pedido el mismo juguete 7 y 9...

    Pues bien solo quiero sacar los hermanos que hayan pedido un mismo juguete y no sacar a los que no lo hicieran...¿Cómo puedo hacer esto?


    • Editado Willy343 miércoles, 1 de noviembre de 2017 10:09 Error en la query
    miércoles, 1 de noviembre de 2017 10:05

Respuestas

  • Te sugiero que comienzes con una consulta mas sencilla.

    ninio + sibling + juguete_pedido_ninio
    intersect
    ninio + sibling + juguete_pedido_sibling;

    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid1
    inner join wished_toy as wt on wt.letterid = l.letterid

    intersect

    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid2
    inner join wished_toy as wt on wt.letterid = l.letterid;

    Ese resultado lo puedes unir (hacer join) con las tablas respectivas para traer nombres y especificaciones de juquetes. Use una CTE o tabla derivada para mas legibilidad.

    Otra forma seria usar cada query como una tabla derivada y unirlas.

    select *
    from (query 1) as q1 inner join (query 2) on q2.childid1 = q1.childid1 and q2.childid2 = q1.childid2 and q2.toyid = q1.toyid;

    Luego prosigues a traer el resto de la informacion necesaria haciendo join con las tablas [child] y [toy].

    with R1 as (
    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid1
    inner join wished_toy as wt on wt.letterid = l.letterid
    )
    , R2 as (
    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid2
    inner join wished_toy as wt on wt.letterid = l.letterid
    )
    , R3 as (
    select childid1, childid2, toyid from R1
    intersect
    select childid1, childid2, toyid from R2
    )
    select c.childid, c.child_name, s.childid as sis, s.child_name as sname, t.toy_name
    from R3 inner join child as c on c.childid = R3.childid1
    inner join child as s on s.childid = R2.chilid2
    inner join toy as t on t.toyid = R3.toyid;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP miércoles, 1 de noviembre de 2017 13:01
    • Marcado como respuesta Willy343 miércoles, 1 de noviembre de 2017 17:16
    miércoles, 1 de noviembre de 2017 12:52

Todas las respuestas

  • Te sugiero que comienzes con una consulta mas sencilla.

    ninio + sibling + juguete_pedido_ninio
    intersect
    ninio + sibling + juguete_pedido_sibling;

    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid1
    inner join wished_toy as wt on wt.letterid = l.letterid

    intersect

    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid2
    inner join wished_toy as wt on wt.letterid = l.letterid;

    Ese resultado lo puedes unir (hacer join) con las tablas respectivas para traer nombres y especificaciones de juquetes. Use una CTE o tabla derivada para mas legibilidad.

    Otra forma seria usar cada query como una tabla derivada y unirlas.

    select *
    from (query 1) as q1 inner join (query 2) on q2.childid1 = q1.childid1 and q2.childid2 = q1.childid2 and q2.toyid = q1.toyid;

    Luego prosigues a traer el resto de la informacion necesaria haciendo join con las tablas [child] y [toy].

    with R1 as (
    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid1
    inner join wished_toy as wt on wt.letterid = l.letterid
    )
    , R2 as (
    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid2
    inner join wished_toy as wt on wt.letterid = l.letterid
    )
    , R3 as (
    select childid1, childid2, toyid from R1
    intersect
    select childid1, childid2, toyid from R2
    )
    select c.childid, c.child_name, s.childid as sis, s.child_name as sname, t.toy_name
    from R3 inner join child as c on c.childid = R3.childid1
    inner join child as s on s.childid = R2.chilid2
    inner join toy as t on t.toyid = R3.toyid;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP miércoles, 1 de noviembre de 2017 13:01
    • Marcado como respuesta Willy343 miércoles, 1 de noviembre de 2017 17:16
    miércoles, 1 de noviembre de 2017 12:52
  • Te sugiero que comienzes con una consulta mas sencilla.

    ninio + sibling + juguete_pedido_ninio
    intersect
    ninio + sibling + juguete_pedido_sibling;

    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid1
    inner join wished_toy as wt on wt.letterid = l.letterid

    intersect

    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid2
    inner join wished_toy as wt on wt.letterid = l.letterid;

    Ese resultado lo puedes unir (hacer join) con las tablas respectivas para traer nombres y especificaciones de juquetes. Use una CTE o tabla derivada para mas legibilidad.

    Otra forma seria usar cada query como una tabla derivada y unirlas.

    select *
    from (query 1) as q1 inner join (query 2) on q2.childid1 = q1.childid1 and q2.childid2 = q1.childid2 and q2.toyid = q1.toyid;

    Luego prosigues a traer el resto de la informacion necesaria haciendo join con las tablas [child] y [toy].

    with R1 as (
    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid1
    inner join wished_toy as wt on wt.letterid = l.letterid
    )
    , R2 as (
    select s.childid1, s.childid2, wt.toyid
    from sibling as s inner join letter as l on l.childid = s.childid2
    inner join wished_toy as wt on wt.letterid = l.letterid
    )
    , R3 as (
    select childid1, childid2, toyid from R1
    intersect
    select childid1, childid2, toyid from R2
    )
    select c.childid, c.child_name, s.childid as sis, s.child_name as sname, t.toy_name
    from R3 inner join child as c on c.childid = R3.childid1
    inner join child as s on s.childid = R2.chilid2
    inner join toy as t on t.toyid = R3.toyid;


    AMB




    Lo primero,muchas gracias por las respuestas y el interés.

    Analizando y observanso su respuesta,la primera query es la mas interesante pues debe ser lo mas sencilla posible.

    Esa query me trae los siguientes datos:

    Query

    select s.child_id1, s.child_id2, wt.toy_id
     from sibling as s inner join letter as l on l.child_id = s.child_id1
     inner join wished_toy as wt on wt.letter_id = l.letter_id
    
     intersect
    
     select s.child_id1, s.child_id2, wt.toy_id
     from sibling as s inner join letter as l on l.child_id = s.child_id2
     inner join wished_toy as wt on wt.letter_id = l.letter_id;

    La cual me trae los jueguetes que se han pedido y los hermanos que han repetido juguete,que se ve claramente que son las parejas formadas por (1 y 11) y (3 y 12).

    11,1,9
    1,11,4
    3,12,2
    3,12,5
    11,1,7
    11,1,5
    1,11,9
    12,3,5
    12,3,2
    11,1,4
    1,11,5
    1,11,7

    Bien,el caso es que realmente lo que quiero es que la query me devuelva el id de los niños,su nombre y fecha de nacimiento y no se como sacar esos datos una vez obtenidos los niños que han pedido un juguete igual a su hermano.

    ¿Cómo hago para que la query me saque en pantalla solo eso?Me tiene muy liado esta query.

    Un saludo.


    • Editado Willy343 miércoles, 1 de noviembre de 2017 13:33 Errores en la escritura
    • Propuesto como respuesta Juan MondragónModerator lunes, 6 de noviembre de 2017 23:26
    miércoles, 1 de noviembre de 2017 13:32
  • Leistes el ultimo query de mi respuesta?

    En el aplico todo lo que preguntas.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    miércoles, 1 de noviembre de 2017 15:28
  • Tienes toda la razón, por fin entendí lo que me querias decir, ahora si me funciona perfecto.

    Muchas gracias.

    miércoles, 1 de noviembre de 2017 17:17
  • Tienes toda la razón, por fin entendí lo que me querias decir, ahora si me funciona perfecto.

    Muchas gracias.

    no consigo integrar todo en una única consulta. Lo has conseguido?
    lunes, 6 de noviembre de 2017 18:32