2013-10-10 21 views
1

我有如下表IN子句並不在我的嵌入式SQL語句作品

Table User 
UserID   Name 
1    Om 
2    John 
3    Kisan 
4    Lisa 
5    Karel 

Table Game 
Games   Players 
Golf   1,3,5 
Football  4 

我寫查詢:

Select UserId, 
Name from User 
Where UserID IN 
    (Select Players from Game where Games='Golf') 

Result: 
~~~~~~~ 
0 Rows 

上面的查詢不返回我的任何結果,而它工作得很好,當我在語句中直接指定In子句的值。

Select UserId, Name 
from User 
Where UserID IN (1,3,5) 

Result: 
~~~~~~~ 
UserID   Name 
1    Om 
3    Kisan 
5    Karel 
3 rows 

但是當我改變的條件非常一日查詢與足球:

Select UserId, Name 
from User 
Where UserID IN 
    (Select Players 
    from Game 
    where Games='Football'). 

這將返回我以下結果:

UserID   Name 
4    Lisa 
1 row 

如何我可以解決,使我非常一號查詢返回我正確的結果?

我覺得我在錯誤的方向。幫幫我!

+0

只是確保...你有兩種資本化。 'UserId'與'UserID'。這是問題嗎? – BlackVegetable

+0

對不起。這確實是Typo錯誤。感謝支持格式化我的問題。 – user2867958

回答

2

第一個查詢翻譯成這樣:

Select UserId, Name 
from User 
Where UserID IN (`1,3,5`) 

注意,它是ID的字符串表示,不以逗號分隔就像你的第二個查詢列表。

有很多Split功能在這裏爲這種情況寫。

你可以利用其中一個作爲這樣的:

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, ',')) 
5

這就是你在現場保存逗號分隔值。現在,你必須把它分解,使用,說this function和做類似

Select User.UserId, User.Name from User 
inner join splitstring((Select Players from Game where Games='Golf')) a 
on User.UserID = a.Name 

但考慮改變你的表「遊戲」的設計

Games   Players 
Golf   1 
Golf   3 
Golf   5 
Football  4 

然後,你可以做一些簡單的

Select User.UserId, User.Name 
from User inner join Game 
on User.UserID = Game.Players 
Where Game.Games = 'Golf' 

沒有任何附加功能。

0
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)) 

SQL Fiddle Results

| USERID | NAME | 
|--------|-------| 
|  1 | Om | 
|  3 | Kisan | 
|  5 | Karel |