3

我正在使用 SQL Server 2005 中的数据库,该数据库在我需要它们的所有表中都没有唯一 ID。我的解决方法是创建另一组具有强制唯一 ID 的类似表。

我现在想将新 ID 的引用带回到初始表集以用于连接等目的。(除此之外:这些表会被定期截断和重新填充,因此是解决方法)。

换句话说:我想在 Table2 中获取 ID,并与 Table1 中的记录正确关联。

对我来说困难的是 Table1 中的记录只有在考虑三个字段时才是唯一的。

我在 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.

有什么想法吗?

谢谢。

4

3 回答 3

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

小提琴演示示例

于 2013-02-23T21:29:53.237 回答
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
于 2013-02-23T21:30:52.580 回答
0

您已经找到了解决问题的方法,但是您创建了冗余数据并对数据库进行了非规范化,从而降低了它的性能。

你说你在一个表中没有唯一的键。然后你说你很难使用使一行唯一的三个字段,例如唯一键。这告诉我你对复合键和复合键的主题有点模糊。我在 Oracle 系统中多次看到它们,当我第一次接触到这个概念时,它让我大吃一惊。

虽然它们是难以理解和使用的概念,但它们在大型标准化环境中可以成为非常强大的工具。我会重新审视它们并再次查看“旧方式”,看看它是否更有意义。即使设计被证明是劣质的,至少你会做出一个明智的设计决定。然后,您可以制作烫发解决方案。

阻止您使用复合键的问题是什么?是复杂性吗?坚持下去!在我创建一个新表并将一袋数据添加到返回的每一行之前,我必须在设计上遇到一个非常严重的错误。考虑使用视图并查询它,无论您需要做什么来保持您的数据库正常化。

Oracle 组合键

维基百科(不是很多信息,但有一些)

于 2013-02-23T22:38:05.060 回答