2016-04-25 57 views
2

我標杆表這樣在MSSQL濾波器行基於ID存在於一個列作爲逗號分隔的字符串

BMID  TestID  BMTitle ConnectedTestID 
--------------------------------------------------- 
1   5   My BM1   0 
2   6   My BM2   5 
3   7   My BM3   5,6 
4   8   My BM4   10,12,8 
5   9   My BM5   0 
6   10  My BM6   3,6 
7   5   My BM7   8,3,12,9 
8   3   My BM8   7,10 
9   8   My BM9   0 
10   12  My BM10   9 
--------------------------------------------- 

在解釋表一點

這裏TestID和連接TestID是扮演角色。如果用戶想要對TestID所有的基準3

它應該返回行,其中testID = 3,並且還如果

這意味着具有具有逗號分隔值中那個testID在它connectedTestID列中的任何行,如果用戶指定值3作爲testID,它應該返回

--------------------------------------------- 
8   3   My BM8   7,10 
7   5   My BM7   8,3,12,9 
6   10  My BM6   3,6 
-------------------------------------------- 

希望清楚它們是如何返回這3行的。意思第一行是因爲testID 3在那裏。另外兩行,因爲3在其connectedIDs單元中

回答

5

您應該修復數據結構。在逗號分隔的列表中存儲數字ID是一個糟糕的壞主意:

  • SQL Server沒有最好的字符串操作函數。
  • 將字符串存儲爲字符串是一個壞主意。
  • 有未申報的外鍵關係是一個壞主意。
  • 生成的查詢無法使用索引。

當你正在探索一個結表,所以你可以修復與數據結構中的什麼問題,你可以使用查詢像這樣:

where testid = 3 or 
     ',' + ConnectedTestID + ',' like '%,3,%' 
+0

不幸的是我一直要求不要觸摸結構的現有表格。唯一允許的是使用一個沒有使用任何東西的列。有了這種情況,我想這是唯一的解決方案...非常感謝解決方案 –

+0

@sforsandeep。 。 。關鍵是你應該使用*另一個*表。存儲列表根本不需要對該表進行任何更改(當然,將TestId作爲某個表的主鍵是很有幫助的,因此您可以聲明外鍵關係)。 –

+0

這是真的先生..但不幸的是,我不被允許爲該場景創建另一個表。我完全按照您的說法提供了另一張桌子的解決方案。但我不知道我的老闆被說只用這個表來提供解決方案。因此,我想出了這個想法.. –

相關問題