让我们考虑以下表结构:
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%的时间内填写它,这是可以的。但我认为可能有比使用两列存储单个值更好的方法。
答案 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存储列表时,用户可以手动覆盖它以选择特定值。
我不确定这是否是最有效的解决方案,但至少它不需要在视图中使用两列。