2016-08-18 3 views
2

У меня есть две таблицы, одна из которых представляет некоторые данные и одну, которая связывает две части данных вместе. Первый, Redaction, имеет три столбца; ID, X, Y. Второй, LinkedRedactions, имеет две колонки; PrimaryID, SecondaryID, которые являются ID s из двух строк из Redaction, которые связаны, и должны иметь одинаковые значения X и Y.SQL-Server: Обновление таблицы из другой таблицы

То, что я хочу сделать, это обновить значения X и Y в Redaction для SecondaryID с, если они уже не так же, как значения для X и Y для соответствующего PrimaryID.

К сожалению, я не могу использовать TRIGGER, так как скрипты будут работать на платформе Относительности kCura, которая их не позволяет. 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 

Это обновляет таблицу [Redaction] через псевдоним «red».

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

Это присоединяется к таблице ссылок и таблице, которые будут обновляться вторичными идентификаторами и идентификаторами соответственно.

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

Это соединяет таблицу Link и [Redaction] таблицу еще раз, но использует первичный идентификатор и идентификатор столбца соответственно. Это самосоединение, которое позволяет нам обновлять набор значений в таблице с другим набором значений из той же таблицы.

Нет условий, требующих, поскольку условия выполняются в предложениях 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] 
Смежные вопросы