none
Filtro existe entre tablas RRS feed

  • Pregunta

  • Buenas tardes tengo un inconveniente el cual no se como plantear en una consulta SQL, favor me podrían ayudar.

    Por un lado tengo una tabla la cual tiene el campo caja y estado (caja es id) 

    Por otro lado tengo una tabla temporal que solo tiene el campo caja

    Necesito en mi consulta mostrar los estados 1 y 2 pero los que son estado 2 debe cumplir con la condición de estar en la tabla temporal, de manera que lo devuelto seria las cajas:

    1 - 2 - 3 - 5 -7

    Desde ya muchas gracias.


    Sebastian Peralta

    lunes, 29 de marzo de 2021 15:27

Respuestas

  • Hola Sebastian Peralta:

    La mejor manera de poder ayudarte, siempre es que el escenario que planteas tenga un script simple con las tablas y las insercciones de datos.

    Create table dbo.cajas (caja int primary key, estado int)
    go
    
    Insert into dbo.cajas (caja, estado)
    values
    (1,1),
    (2,2),
    (3,1),
    (4,2),
    (5,1),
    (6,2),
    (7,2);
    go

    Si la tabla temporal fuera tal que:

    Create table #temp (caja_id int)
    Insert into #temp (caja_id)
    values
    (2),(7);

    El script según lo que comentas, no devolvería las cajas 4 y 6 porque no están en la tabla temporal.

    --- exists
    Select * from dbo.cajas c
    Where estado =1 or
    (
    	exists (select * from #temp t where t.caja_id =c.caja and c.estado = 2 )
    	
    )
    

    Es importante que lo que contiene exists (la consulta interior, se iguala con la consulta exterior por el alias de la tabla.


    No es la única manera, ni mucho menos, pero exists funciona muy bien.

    Cómo se usa Exists

    https://javifer2.wordpress.com/2020/06/17/exists-como-se-implementa/

    lunes, 29 de marzo de 2021 15:39

Todas las respuestas

  • Hola Sebastian Peralta:

    La mejor manera de poder ayudarte, siempre es que el escenario que planteas tenga un script simple con las tablas y las insercciones de datos.

    Create table dbo.cajas (caja int primary key, estado int)
    go
    
    Insert into dbo.cajas (caja, estado)
    values
    (1,1),
    (2,2),
    (3,1),
    (4,2),
    (5,1),
    (6,2),
    (7,2);
    go

    Si la tabla temporal fuera tal que:

    Create table #temp (caja_id int)
    Insert into #temp (caja_id)
    values
    (2),(7);

    El script según lo que comentas, no devolvería las cajas 4 y 6 porque no están en la tabla temporal.

    --- exists
    Select * from dbo.cajas c
    Where estado =1 or
    (
    	exists (select * from #temp t where t.caja_id =c.caja and c.estado = 2 )
    	
    )
    

    Es importante que lo que contiene exists (la consulta interior, se iguala con la consulta exterior por el alias de la tabla.


    No es la única manera, ni mucho menos, pero exists funciona muy bien.

    Cómo se usa Exists

    https://javifer2.wordpress.com/2020/06/17/exists-como-se-implementa/

    lunes, 29 de marzo de 2021 15:39
  • Funciona perfecto!!! Muchas gracias.

    Sebastian Peralta

    lunes, 29 de marzo de 2021 15:55