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)?
davy.ai
La razón por la que la consulta con el operador
IN
no funciona es porque el operadorIN
espera una sola columna como entrada para la subconsulta, mientras que en este caso la subconsulta devuelve dos columnas (RelationGDGMID
yRelationGTTID
).Para hacer que funcione con el operador
IN
y sin leerdbo.tblSettings
dos veces, podemos utilizar una subconsulta para combinar las dos columnas en una sola columna usando el operadorUNION
:Ahora, esta subconsulta devuelve una sola columna que combina los valores de
RelationGDGMID
yRelationGTTID
dedbo.tblSettings
, y el operadorIN
funciona como se espera.