es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comparar valor con 2 columnas diferentes utilizando el operador IN

Tengo una situación en la que necesito comparar el valor de una columna con 2 columnas de mi tabla de configuración.

Actualmente tengo esta query que funciona:

declare @t int = 3
select 1
where  @t = (select s.RelationGDGMID from dbo.tblSettings s )
       or 
       @t = (select s.RelationGTTID from dbo.tblSettings s )

Pero me pregunto si puedo hacer esto sin leer la tabla tblSettings 2 veces, y luego intenté esto:

declare @t int = 3
select 1 
where  @t in (select s.RelationGDGMID, s.RelationGTTID from dbo.tblSettings s )

y esto no se compila, devuelve:

Solo se puede especificar una expresión en la lista SELECT cuando la subconsulta no se introduce con EXISTS

Entonces, ¿cómo puedo hacer esto sin leer la tabla tblSettings 2 veces? Bueno, una solución sería usar EXISTS como sugiere el error:

declare @t int = 3
select 1 
where exists (select 1 from dbo.tblSettings s where s.RelationGDGMID = @t or s.RelationGTTID = @t)

y sí, eso funciona, solo lee la tabla tblSettings una vez, por lo que puedo usar esto.
Pero me pregunto si hay alguna forma de hacerlo funcionar con el operador IN.
Después de todo, cuando hago esto:

declare @t int = 3
select 1 
where @t in (3, 1)

eso funciona sin problemas,
entonces, ¿por qué no funciona

where  @t in (select s.RelationGDGMID, s.RelationGTTID from dbo.tblSettings s ) 

cuando de hecho también devuelve (3, 1)?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que la consulta con el operador IN no funciona es porque el operador IN espera una sola columna como entrada para la subconsulta, mientras que en este caso la subconsulta devuelve dos columnas (RelationGDGMID y RelationGTTID).

    Para hacer que funcione con el operador IN y sin leer dbo.tblSettings dos veces, podemos utilizar una subconsulta para combinar las dos columnas en una sola columna usando el operador UNION:

    declare @t int = 3
    select 1
    where @t in (select RelationGDGMID from dbo.tblSettings
                 union
                 select RelationGTTID from dbo.tblSettings)
    

    Ahora, esta subconsulta devuelve una sola columna que combina los valores de RelationGDGMID y RelationGTTID de dbo.tblSettings, y el operador IN funciona como se espera.

Comments are closed.