none
consultas anidadas y inner join no es igual?

    Question

  • hola, tengo los isguientes Sripts

    Select count(1)

    FROM I

    WHERE I.c IN (    SELECT P.c
                                FROM P
                               WHERE P.n IN ( SELECT C.n
                                                         FROM C )
                            )

    y no me da igual a

    SELECT COUNT(1)
    FROM I
    INNER JOIN P ON P.c=I.c
    INNER JOIN C ON P.n=C.n

    Porque?

    Friday, December 14, 2012 3:21 PM

Answers

  • HOla Buen Día:

    Cuando haces un SELECT * FROM tablaA WHERE campo IN ( subQuery ) esto lo que hace es obtener los registros de la tablaA siempre y cuando existan en el resultado del subQuery, es decir no importando que tu subquery arroje como resultado que un mismo ID exista más de 3 veces, el WHERE IN solo pregunta si existe, más no cuantas veces existe en el subQuery...

    A diferencia con el INNER JOIN, aquí lo que hace es un producto cartesiando condicionado por el ON, supongamos que tienes la tabla A y B, si en la tabla A existe una sola vez el ID 1 y en tu tabla B existe 3 veces, el resultado de tu query será 3 veces ( por el producto cartesiano )

    Te dejo un ejemplo sencillo de lo que traté de explicar :)

    declare @tableA table( id int  )
    declare @tableB table( id int )
    
    insert into @tableA
    values(1),(2),(3)
    
    insert into @tableb
    values(2),(2),(3),(3),(5)
    
    
    select * from @tableA
    select * from @tableB
    
    select *
    from @tableA
    where id in ( select id from @tableB )
    
    select * from @tableA a
    inner join @tableB b on a.id = b.id 

    Siendo este el resultado:

    --tableA
    id
    -----------
    1
    2
    3

    --tableB
    id
    -----------
    2
    2
    3
    3
    5

    --select * from @tableA where id in ( select id from @tableB )
    id
    -----------
    2
    3

    --select * from @tableA a inner join @tableB b on a.id = b.id 
    id          id
    ----------- -----------
    2           2
    2           2
    3           3
    3           3

    Espero haberme explicado

    SALUDOS !


    Sergio Sánchez Arias

    Friday, December 14, 2012 4:21 PM

All replies

  • HOla Buen Día:

    Cuando haces un SELECT * FROM tablaA WHERE campo IN ( subQuery ) esto lo que hace es obtener los registros de la tablaA siempre y cuando existan en el resultado del subQuery, es decir no importando que tu subquery arroje como resultado que un mismo ID exista más de 3 veces, el WHERE IN solo pregunta si existe, más no cuantas veces existe en el subQuery...

    A diferencia con el INNER JOIN, aquí lo que hace es un producto cartesiando condicionado por el ON, supongamos que tienes la tabla A y B, si en la tabla A existe una sola vez el ID 1 y en tu tabla B existe 3 veces, el resultado de tu query será 3 veces ( por el producto cartesiano )

    Te dejo un ejemplo sencillo de lo que traté de explicar :)

    declare @tableA table( id int  )
    declare @tableB table( id int )
    
    insert into @tableA
    values(1),(2),(3)
    
    insert into @tableb
    values(2),(2),(3),(3),(5)
    
    
    select * from @tableA
    select * from @tableB
    
    select *
    from @tableA
    where id in ( select id from @tableB )
    
    select * from @tableA a
    inner join @tableB b on a.id = b.id 

    Siendo este el resultado:

    --tableA
    id
    -----------
    1
    2
    3

    --tableB
    id
    -----------
    2
    2
    3
    3
    5

    --select * from @tableA where id in ( select id from @tableB )
    id
    -----------
    2
    3

    --select * from @tableA a inner join @tableB b on a.id = b.id 
    id          id
    ----------- -----------
    2           2
    2           2
    3           3
    3           3

    Espero haberme explicado

    SALUDOS !


    Sergio Sánchez Arias

    Friday, December 14, 2012 4:21 PM
  • gracias Ronald

    super claro

    yualgata

    Friday, December 14, 2012 10:22 PM