2013-05-16 100 views
0

我有3張桌子,其中2張是臨時桌子。一個有舊的價值要更新,另一個有新的價值。如何從其他2個包含舊值和SQL Server中的新值的表中更新表?

第一表包含的列TelephoneID,而另外兩個只包含一個列,telephones

TelephonesOrganization

ID  Telephone 
1   1234 
1   4567 
1   5678 

TelephonesToUpdate

Telephone 
1234 
4567 

TelephonesNewValues

9999 
9999 

的值,以更新TelephonesToUpdate直接對應於TelephonesNewValues同一行,例如1234將採取值9999時,也ID是可變在這種情況下它的1

我試過使用和UPDATE和在哪裏比較Telephones和id,但由於某種原因,我得到重複的條目。

Declare @ID int 
Set @ID = 1 
UPDATE A 
SET A.Telephone = 12345 FROM TelephoneOrg A, @TempOLDTelephones B , @TempNEWTelephones C 
WHERE A.Telephone = B.Telephone and A.ID = @ID 

預先感謝任何回答,

但丁。

+0

您的數據模型似乎存在正確的候選鍵被定義/存在的問題。這會使您的應用程序(即您的更新聲明)的工作更模糊,效率更低並且可能會造成災難性後果。但是,也許你已經覆蓋,只是沒有顯示它。例如,您想要更新TelephonesOrganization表 - 但該表的關鍵是什麼?在不知道的情況下,很難回答這個問題。 –

+0

你應該有**顯式ID的某種**來連接你的兩個表'TelephonesToUpdate'和'TelephonesNewValues' - **不要**僅僅依靠「排序」,因爲關係表**不具有**任何*隱式*排序 - 你必須有一些東西用來鏈接兩個單獨的表中的兩行! –

+0

電話組織的主要關鍵是ID +電話,因爲組織不能有2部電話,因爲我知道他們將始終按順序排列。由於表格是函數的返回值,但是你指的是什麼,它們沒有任何隱式順序? –

回答

1

我相信你有TelephonesToUpdate和TelephonesNewValues但之間沒有ID的順序是一樣的,所以我們可以創建一個與ROW_NUMBER:http://msdn.microsoft.com/en-us/library/ms186734(v=sql.100).aspx

UPDATE t 
    SET t.Telephone = b.Telephone 
FROM TelephonesOrganization AS t 
INNER JOIN 
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS 'ID' 
    ,Telephone 
    FROM TelephonesToUpdate 
) AS a 
    ON t.Telephone = a.Telephone 
INNER JOIN 
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS 'ID' 
    ,Telephone 
    FROM TelephonesNewValues 
) AS b 
    ON a.ID = b.ID 
; 

下面是一個SQL撥弄你可以玩:http://sqlfiddle.com/#!3/3c15d/3

+0

謝謝,我結束了一個類似的代碼,它的工作完美。,是的,我沒有鍵鏈接兩個表我只想到使用命令來鏈接它們 –

+0

也感謝鏈接我didn不知道這樣的網頁存在。它會在小測試中派上用場 –

0
update TelephonesOrganization o 
    set o.Telephone = (select u.TelephonesNewValues 
         from TelephonesToUpdate u 
         where u.Telephone = o.Telephone) 
where o.ID = 1 
    and exists (select u.TelephonesNewValues 
        from TelephonesToUpdate u 
       where u.Telephone = o.Telephone); 

更新:我在問題更新之前回答了這個問題。我不認爲TelephoneNewValues是一張桌子。我以爲它是TelephoneToUpdate表的一列。另外我在我的exists子句中有一個錯誤。

相關問題