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