我继承了一个没有规范化的SQL服务器数据库,让我很头疼。我在SQL方面不是很有经验,可能会提出愚蠢的问题,但对于如何推进以下方案表示感谢。
我有三张表如下: -
结果表:
**ResId CompId Name Result**
1 1 Band A 2
2 1 Band B 1
3 1 Band C 3
4 2 Band A* 2
5 2 Band B 1
6 2 Band C 3
Bands当前名称表:
**BandId BandName**
1 Band A
2 Band B
3 Band C
以前称为乐队的名称表(在BandId上链接):
**oldBandId BandId oldBandName**
1 1 Band A*
2 1 Band a
2 2 Band b
我希望合并结果表中的波段名称列表,用bandId替换波段名称,但结果表包含两个表中的波段名称。我应该创建一些连接表并将其用作结果表中的bandId?如果是这样我在这个连接表中需要什么,它只是bandId / oldBandId的psuedo-Id和连接的表名,然后将它放在结果表中?
然后我想使用查询来选择用户通过任何名称变体(新的或旧的)选择乐队的所有结果,并返回结果,包括与乐队链接的所有名称,即选择乐队A将返回结果乐队A和乐队A *。
提前致谢
史蒂夫
答案 0 :(得分:2)
我喜欢在结果表中使用band id的想法。我建议删除“旧乐队名称”表并将其替换为乐队别名表,因为这听起来更像你想要的。 band别名表只有band id和每行一个别名。
答案 1 :(得分:1)
我认为你当前的数据库结构已经足够好 - 我想不出任何方法可以改进它,而不会让它进一步复杂化(特别是如果你想保留旧的波段名称)。
您可以根据需要编写查询 -
select * from results
where Name = @bandName or
Name in (select oldBandName
from oldBands
where BandId in (select BandId
from Bands
where BandName = @bandName))