使用包含所选项目的列表作为值

时间:2013-07-01 12:26:47

标签: sql sql-server database sql-server-2008

让我们考虑以下表结构:

Table1

Table1_ID  A
1          A1
2          A1;B1

Table2

Table2_ID  Table1_ID  B       C
1          1          foobar  barfoo 
2          2          foofoo  barbar

我正在使用的视图由以下查询定义:

SELECT Table1.A, B, C
FROM Table2
INNER JOIN Table1 ON Table1.Table1_ID = Table2.Table1_ID;

95%的A数据包含2个字符长的字符串。在这种情况下,它工作正常。但是,其中5%实际上是此字段的可能值的列表(使用分号作为分隔符)。

这意味着我的用户希望在适当的时候选择在其余时间自动继续使用单个值。当然,使用单个INNER JOIN是不可能的,因为不能有一个常量选定值。

Table2 非常大,而Table1非常小。在Table2中的每一行中手动填充本地A字段将是巨大浪费时间。

SQL(或者更具体地说,SQL Server 2008)是否有一种有效的方法来处理这个问题?例如,字段中包含所选项目的列表?

我计划添加一个“A_ChosenValue”字段,当A中有列表时,该字段将存储所选值,当A仅存储单个值时,该字段保持为空。它只需要用户在5%的时间内填写它,这是可以的。但我认为可能有比使用两列存储单个值更好的方法。

2 个答案:

答案 0 :(得分:1)

理想情况下,您只需更改架构并添加新实体,以支持Table1和Table2之间的多对多关系,例如以下所有三列的复合键。

Table3

| Table1_ID | Table2_ID | A  |
-----------------------------
|    1      |     1     | A1 |
------------------------------
|    2      |     2     | A1 |
------------------------------
|    2      |     2     | B1 |
------------------------------

然后你可以在这张桌子上进行选择和加入,由于它被编入索引,你不会失去任何表现。

在不改变表结构或规范化数据的情况下,可以使用conditional select statement like that shown in this SO post,但查询效果不会很好,因为您必须使用函数来拆分包含分号的值。

答案 1 :(得分:0)

回答我自己的问题:

我在Table1中添加了一个LocalA列,以便我的视图实际选择ISNULL(LocalA, Table1.A)。因此,默认情况下显示的值等于A,当A存储列表时,用户可以手动覆盖它以选择特定值。

我不确定这是否是最有效的解决方案,但至少它不需要在视图中使用两列。