Tengo la siguiente tabla
Table User
UserID Name
1 Om
2 John
3 Kisan
4 Lisa
5 Karel
Table Game
Games Players
Golf 1,3,5
Football 4
Escribí consulta:
Select UserId,
Name from User
Where UserID IN
(Select Players from Game where Games="Golf")
Result:
~~~~~~~
0 Rows
La consulta anterior no me devuelve ningún resultado mientras funciona bien cuando especifico directamente los valores para la cláusula In en la declaración.
Select UserId, Name
from User
Where UserID IN (1,3,5)
Result:
~~~~~~~
UserID Name
1 Om
3 Kisan
5 Karel
3 rows
Sin embargo, cuando cambio la condición en muy primera consulta con el fútbol:
Select UserId, Name
from User
Where UserID IN
(Select Players
from Game
where Games="Football").
Esto me devuelve el siguiente resultado:
UserID Name
4 Lisa
1 row
¿Cómo puedo evitar que mi primera consulta me devuelva el resultado correcto?
Creo que estoy en la dirección equivocada. ¡Ayúdame!
Respuestas
5 para la respuesta № 1Esto es lo que obtiene para almacenar valores separados por comas en un campo. Ahora tienes que dividirlo, usando, digamos esta función y hacer algo como
Select User.UserId, User.Name from User
inner join splitstring((Select Players from Game where Games="Golf")) a
on User.UserID = a.Name
Pero considere cambiar el diseño de su "Juego" de mesa a
Games Players
Golf 1
Golf 3
Golf 5
Football 4
Entonces puedes hacer simple
Select User.UserId, User.Name
from User inner join Game
on User.UserID = Game.Players
Where Game.Games = "Golf"
Sin funciones adicionales.
2 para la respuesta № 2
Su primera consulta se traduce a esto:
Select UserId, Name
from User
Where UserID IN (`1,3,5`)
Observe que es una representación de cadena de los ID, no una lista separada por comas como en su segunda consulta.
Hay muchos Split
funciones por ahí escritas para este mismo escenario.
Puede utilizar uno de ellos como tal:
DECLARE @PlayersCsv NVARCHAR(MAX)
Select @PlayersCsv = Players from Game where Games="Golf"
Select UserId,
Name from User
Where UserID IN
(Select Value FROM dbo.Split(@PlayersCsv, ","))
0 para la respuesta № 3
DECLARE @xml AS xml
SET @xml = (SELECT cast("<X>"+(""+replace(players,"," ,"</X><X>")+"</X>") AS xml)
FROM Game WHERE Games="Golf")
SELECT UserId, Name
FROM User
WHERE UserID IN
(SELECT N.value(".", "varchar(10)") as value FROM @xml.nodes("X") as T(N))
| USERID | NAME |
|--------|-------|
| 1 | Om |
| 3 | Kisan |
| 5 | Karel |