我正在使用SQL Server 2005中的数据库,该数据库在我需要的所有表中没有唯一ID。我的解决方法是创建另一组具有强制唯一ID的类似表。< / p>
我现在想要将新ID的引用带回到用于Join目的的初始表集等。 (旁白:这些表被截断并定期重新填充,因此解决方法)。
换句话说:我想在Table2中获取ID并正确地与Table1中的记录相关联。
对我来说,困难的一点是表1中的记录只有在考虑三个字段时才是唯一的。
我在Table1中添加了一个ID字段,然后我尝试了以下内容:
UPDATE dbo.Table1
SET dbo.Table1.ID = dbo.Table2.ID
WHERE dbo.Table1.foo = dbo.Table2.foo
And dbo.Table1.bar = dbo.Table2.bar
And dbo.Table1.buzz = dbo.Table2.buzz
但是,我收到以下类型的错误:
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dbo.Table2.foo" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dbo.Table2.bar" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dbo.Table2.buzz" could not be bound.
有什么想法吗?
感谢。
答案 0 :(得分:3)
这应该适合你:
UPDATE t
SET id = t2.id
FROM table1 t JOIN
table2 t2 ON t.foo = t2.foo AND
t.bar = t2.bar AND
t.buzz = t2.buzz
答案 1 :(得分:1)
您不在查询中对表2进行任何引用。请尝试以下方法:
UPDATE dbo.Table1
SET ID = Table2.ID
FROM Table1 INNER JOIN Table 2 ON
Table1.foo = Table2.foo
And Table1.bar = Table2.bar
And Table1.buzz = Table2.buzz
答案 2 :(得分:0)
您已找到针对您的问题的解决方法,但您已创建冗余数据并对数据库进行非规范化,从而降低其性能。
你说你在一个表中没有唯一的密钥。然后你说你很难使用三个字段使一行独特,例如一把独特的钥匙。这告诉我你对Composite和Compound键的主题有点模糊。我在Oracle系统中已经多次看到它们,并且在第一次介绍这个概念时它让我大吃一惊。
虽然它们是难以理解和使用的概念,但它们在大型规范化环境中可以是非常强大的工具。我会去刷他们,然后再看看“旧路”,看看它是否更有意义。即使设计结果较差,至少你会做出明智的设计决定。然后,您可以制作烫发解决方案。
阻止您使用复合键的问题是什么?这是复杂性吗?坚持下去!在制作新表并向返回的每一行添加一包数据之前,我必须在设计中遇到相当严重的错误。查看使用视图并查询它,无论您需要做什么来保持数据库规范化。
Wikipedia(不是很多信息,但有些信息)