SQL-Server:从另一个表更新表
问题描述:
我有两个表,一个表示一些数据,一个将两个数据链接在一起。 第一个,Redaction
,有三列; ID
,X
,Y
。 第二个,LinkedRedactions
,有两列; PrimaryID
,SecondaryID
,它们是Redaction
中两行的ID
s所链接的,并且需要具有相同的X
和Y
的值。SQL-Server:从另一个表更新表
我想要做的就是更新Redaction
为SecondaryID
S的X
和Y
值,如果他们不已经是相同X
和Y
为相应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第二天,所以更多的描述性答案将不胜感激
答
整个代码可以使用内部连接进行简化。
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子句中处理条件,因此不需要条件。
答
您可以使用UPDATE FROM
UPDATE [Redaction]
SET
[X] = T.[X],
[Y] = T.[Y]
FROM
@T T
WHERE
[Redaction].[ID] = T.[ID]
谢谢,完美的作品。你能简单介绍一下它的工作原理吗? – JChristen
很好的解释,谢谢! – JChristen