0

让我们考虑以下表结构:

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;

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

这意味着我的用户希望在适当的时候在这些值之间进行选择,在其余时间自动使用单个值。当然,这对于单个 是不可能的INNER JOIN,因为不能有一个恒定的选定值。

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

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

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

4

2 回答 2

1

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

Table3

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

然后,您可以在此表上进行选择和连接,并且由于它被索引,您不会失去任何性能。

在不更改表结构或规范化数据的情况下,可以使用类似此 SO 帖子中所示的条件选择语句,但查询不会执行得那么好,因为您必须使用函数来拆分包含分号的值。

于 2013-07-01T12:58:54.767 回答
0

回答我自己的问题:

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

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

于 2013-07-01T14:00:25.093 回答