2013-02-23 90 views
3

我正在使用SQL Server 2005中的一個數據庫,在所有我需要它們的表中沒有唯一標識。我的解決方法是創建另一組具有強制唯一ID的類似表。在一個表中設置字段等於另一個字段在某些條件下

我現在想要將新ID的引用返回到用於Join目的等等的初始表的集合。 (另外:這些表格會被截斷和重新填充,因此是解決方法)。

換句話說:我想在Table2中使用ID並正確地與Table1中的記錄相關聯。

對我而言,困難的一點是Table1中的記錄只有在考慮三個字段時纔是唯一的。

我在表1中添加一個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

這應該爲你工作:

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

+0

您好,感謝。我對t和table1,t2和table2之間的區別在速記中感到困惑? – user1893148 2013-02-23 21:37:18

+0

@ user1893148 - np,這些只是表名的別名。希望這有助於! – sgeddes 2013-02-23 21:38:43

+0

@ user1893148 - 與此相同:http://sqlfiddle.com/#!3/75c9c/1 - 只是更容易輸入:)祝你好運! – sgeddes 2013-02-23 21:40:14

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 
+0

這起作用。非常感謝。 – user1893148 2013-02-23 21:40:57

0

您已經找到了爲問題的解決方法,但你已經創建冗餘數據和非規範化的數據庫,從而降低它的性能。

你說你沒有一個表中的唯一鍵。然後你說你使用三個使行成爲唯一的字段很困難,例如一個獨特的鑰匙。這告訴我你對複合鍵和複合鍵有點模糊。我在Oracle系統中多次見過他們,第一次向我介紹這個概念時,它讓我大開眼界。

儘管它們是難以理解和使用的概念,但它們在大規範化環境中可能是非常強大的工具。我會去刷他們,再看看「老路」,看看它是否更有意義。即使設計變得更差,至少你會做出明智的設計決定。然後你可以製作一個燙髮解決方案。

是什麼問題阻止您使用組合鍵?這是複雜嗎?堅持下去!在設計新表之前,我必須先設計一個非常嚴重的錯誤,並在返回的每一行中添加一行數據。查看使用視圖並查詢它,無論你需要做什麼來保持你的數據庫規範化。

Oracle Composite Key

Wikipedia(沒有大量的信息,但一些)

+0

[MSDN PRIMARY KEY Constraints](http://msdn.microsoft.com/zh-cn/library/ms191236(v=sql.105).aspx) – 2013-02-23 22:51:10

+0

表格被截斷並重新填充,每天沒有唯一的ID存儲過程。因此,我安置了唯一的ID和必要的字段,以便將它們映射到其他永久性表中。現在,它是存儲過程的一部分,用於檢查每日重新創建表中的記錄是否已存在於具有唯一ID的表中,如果不存在,則創建一個(同時拉入映射字段)。然後,這些ID被拉回到原來的表格中。這樣,ID保持不變,重現日常重新創建的表中的記錄。如果有更好的方法來完成這個... – user1893148 2013-02-24 21:49:39

+0

...那將是驚人的。 – user1893148 2013-02-24 21:52:40

相關問題