2016-08-18 229 views
2

我有兩個表,一個表示一些數據,一個將兩個數據鏈接在一起。 第一個,Redaction,有三列; ID,X,Y。 第二個,LinkedRedactions,有兩列; PrimaryID,SecondaryID,它們是Redaction中兩行的ID s所鏈接的,並且需要具有相同的XY的值。SQL-Server:從另一個表更新表

我想要做的就是更新RedactionSecondaryID S的XY值,如果他們不已經是相同XY爲相應PrimaryID值。

不幸的是,我不能使用TRIGGER,因爲這些腳本將在kCura的Relativity平臺上運行,它不允許它們運行。一個SQL腳本將是理想的,這將會每隔幾秒由一個代理運行。

我已經嘗試聲明一個臨時表,並從該更新,但給我的錯誤

「必須聲明標量變量@T」

DECLARE @T TABLE (
    [ID] INT, [X] INT, [Y] INT 
) 

INSERT INTO @T 
    SELECT 
     [ID], [X], [Y] 
    FROM 
     [Redaction] AS R 
    WHERE 
     [ID] IN (
      SELECT [PrimaryID] FROM [LinkedRedactions] 
     ) 

UPDATE 
    [Redaction] 
SET 
    [X] = @T.[X], [Y] = @T.[Y] 
WHERE 
    [Redaction].[ID] IN (
     SELECT [ID] FROM @T 
    ) 

免責聲明:只是我的SQL第二天,所以更多的描述性答案將不勝感激

回答

2

整個代碼可以使用內部連接進行簡化。

UPDATE red 
SET [X] = redPrimary.[X], [Y] = redPrimary.[Y] 
FROM [Redaction] red 
INNER JOIN [LinkedRedactions] redLnk ON red.[ID] = redLnk.SecondaryIDs 
INNER JOIN [Redaction] redPrimary ON redLnk.PrimaryID = redPrimary.[ID] 

說明:

[Redaction] red 
[LinkedRedactions] redLnk 
[Redaction] redPrimary 

紅,redLnk和redPrimary被稱爲別名,他們正在使用的使用不同的名稱來調用表。

INNER JOIN 

這是一種連接類型,只有在左右表格上都存在相同的列值時纔會匹配。

UPDATE red 
--SET statement 
FROM [Redaction] red 

這隻通過別名'red'更新[Redaction]表。

INNER JOIN [LinkedRedactions] redLnk ON red.[ID] = redLnk.SecondaryIDs 

這將加入鏈接表和要由輔助ID和ID分別更新的表。

INNER JOIN [Redaction] redPrimary ON redLnk.PrimaryID = redPrimary.[ID] 

這再次加入鏈接表和[編輯]表,但分別使用主ID和ID列。這是一個自聯接,它允許我們使用同一個表中的一組不同值更新表中的一組值。

由於在ON子句中處理條件,因此不需要條件。

+1

謝謝,完美的作品。你能簡單介紹一下它的工作原理嗎? – JChristen

+0

很好的解釋,謝謝! – JChristen

0

您可以使用UPDATE FROM

UPDATE [Redaction] 
SET 
    [X] = T.[X], 
    [Y] = T.[Y] 
FROM 
    @T T 
WHERE 
    [Redaction].[ID] = T.[ID]