有没有办法使用表变量作为联接更新的源?

时间:2014-05-07 04:25:36

标签: sql-server tsql

我正在开展一个项目,在这个项目中我需要调整触发事务中不同点值的规则,以确定它们发生了什么。我有一个规则表,它们的当前点值和它们的新点值。我有一张交易表。我有一个规则事务发生表,可以导航规则和事务之间的多对多关系。我需要知道每笔交易的总当前和新分数,以进行进一步的分析。在我的分析过程中,我可以将它放在临时表中,但是当我这样做时,它的工作速度非常慢。所以,我决定将交易表中的分数分成新列。

下面的代码更新了Transactions表,使其在CurrentScore和NewScore列中具有正确的值。我担心的是我使用temp1的临时表比@ temp1表变量慢。但是,我无法测试这种可能性,如下所示:

UPDATE dbo.Transactions
SET dbo.Transactions.CurrentScore = @temp1.CurrentScore
FROM dbo.Transactions INNER JOIN
@temp1 ON dbo.transactions.id=@temp1.transid

...产生语法错误。工作代码如下。在这种情况下,不能使用任何想法或表变量吗?

IF Object_ID('temp1') IS NOT NULL
DROP TABLE temp1
CREATE TABLE temp1 (TransID Int,CurrentScore Int, NewScore Int,
    CONSTRAINT PK_temp1 PRIMARY KEY (TransID))

INSERT INTO dbo.temp1 (TransID,CurrentScore,NewScore) 
SELECT dbo.transactions.ID, 
ISNULL(SUM(dbo.Rules.CurrentScore),0), 
ISNULL(SUM(dbo.Rules.NewScore),0)
    FROM dbo.Rules INNER JOIN
    dbo.RulesTripped ON dbo.rulestripped.ruleid=dbo.rules.id RIGHT OUTER JOIN
    dbo.Transactions ON dbo.rulestripped.transid=dbo.transactions.id
    GROUP BY dbo.transactions.id

UPDATE dbo.Transactions
SET dbo.Transactions.CurrentScore = temp1.CurrentScore,
    dbo.Transactions.NewScore = temp1.NewScore
FROM dbo.Transactions INNER JOIN
dbo.temp1 ON dbo.transactions.id=dbo.temp1.transID

DROP TABLE temp1

1 个答案:

答案 0 :(得分:2)

尝试使用别名。

UPDATE T
SET CurrentScore = T1.CurrentScore
FROM dbo.Transactions T
     JOIN @temp1 T1 ON T.id=T1.transid

至于

  

我担心的是我正在使用的临时表temp1比a慢   @ temp1表变量。我无法测试这种可能性

嗯,这取决于。例如,如果tempdb处于高负荷状态,则结果可能相反 有关临时表和表变量的完整信息,请阅读Martin Smith在What's the difference between a temp table and table variable in SQL Server?

上的答案