在某些条件下将一个表中的字段设置为等于另一个中的字段

时间:2013-02-23 21:22:55

标签: sql sql-server

我正在使用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.

有什么想法吗?

感谢。

3 个答案:

答案 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

Sample Fiddle Demo

答案 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系统中已经多次看到它们,并且在第一次介绍这个概念时它让我大吃一惊。

虽然它们是难以理解和使用的概念,但它们在大型规范化环境中可以是非常强大的工具。我会去刷他们,然后再看看“旧路”,看看它是否更有意义。即使设计结果较差,至少你会做出明智的设计决定。然后,您可以制作烫发解决方案。

阻止您使用复合键的问题是什么?这是复杂性吗?坚持下去!在制作新表并向返回的每一行添加一包数据之前,我必须在设计中遇到相当严重的错误。查看使用视图并查询它,无论您需要做什么来保持数据库规范化。

Oracle Composite Key

Wikipedia(不是很多信息,但有些信息)