2016-04-25 35 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

这是真的先生..但不幸的是,我不被允许为该场景创建另一个表。我完全按照您的说法提供了另一张桌子的解决方案。但我不知道我的老板被说只用这个表来提供解决方案。因此,我想出了这个想法.. –

相关问题