查询不是正常的第三种形式的表

时间:2009-10-12 20:34:20

标签: sql normalization

您好我有一张由懒惰的开发人员设计的桌子,他没有以第3范式创建它。他将数组保存在表中而不是使用MM关系。并且应用程序正在运行,因此我无法更改数据库架构。

我需要像这样查询表:

SELECT * FROM myTable WHERE usergroup = 20

其中usergroup字段包含如下数据:17,19,20或者它也可能只有20或只有19。

我可以搜索: SELECT * FROM myTable WHERE用户组LIKE 20 但在这种情况下,它也会匹配包含200的字段,例如

有人有什么想法吗? 感谢名单

3 个答案:

答案 0 :(得分:4)

修复错误的数据库设计。

短期修复是为正确的结构添加相关表。添加触发器以将旧字段中的信息解析为插入和更新时的相关表。然后编写一个脚本来[解析现有数据。现在你可以通过porperly查询,但你没有破坏任何旧代码。那么你可以搜索旧代码并修复。完成后,只需更改原始表中插入或更新代码的方式,即可添加新表并删除旧列。

答案 1 :(得分:0)

编写一个表值用户定义函数(SQL Server中的UDF,我相信它在其他RDBMS中将有一个不同的名称)来解析包含存储为字符串的列表的列的值。对于逗号分隔列表中的每个项目,您的函数应在表结果中返回一行。当您使用这样的查询时,请查询从UDF返回的结果。

答案 2 :(得分:0)

编写一个函数将逗号分隔的列表转换为表格。应该很简单。然后你可以使用IN()。