假设表1有1,000,000行。在表2中有50,000行
INPUT
表1
Id User InternetAmountDue
1 joe NULL
表2
InternetUserId UserName AmountDue
21 kay 21.00
10091 joe 21.00
我想将表2中的数据合并到表1中,如下所示:
输出
表1
Id User InternetAmountDue
1 joe 21.00
2 kay 21.00
如果涉及大量数据,如何快速完成?
答案 0 :(得分:7)
SQL Server 2008
仅针对您的情况提供特殊构造MERGE
:
MERGE
INTO table1 AS t1
USING table2 AS t2
ON t2.UserName = t1.user
WHEN MATCHED THEN
UPDATE
SET t1.AmountDue = t2.AmountDue
WHEN NOT MATCHED THEN
INSERT (user, InternetAmountDue)
VALUES (t2.UserName, t2.AmountDue)
答案 1 :(得分:2)
INSERT INTO Table1 (User)
SELECT UserName
FROM Table2
WHERE UserName not in (SELECT User FROM Table1)
--
UPDATE t1
SET t1.InternetAmountDue = t2.AmountDue
FROM Table1 t1
JOIN Table2 t2
ON t1.User = t2.UserName
确保将Table2.UserName编入索引。 确保将Table1.User编入索引。
答案 2 :(得分:0)
假设您想在查询中动态合并数据,您可以执行以下操作:
select
t1.id,
t1.user,
case
when t2.AmountDue is not null then t2.AmountDue
else t1.InternetAmountDue
end as InternetAmountDue
from table1 t1
left join table2 t2
on t1.user = t2.username
使用新金额更新表1当然同样容易。
答案 3 :(得分:0)
试试这个。
UPDATE [Table 1]
SET InternetAmountDue = t2.AmountDue
FROM [Table 1] t1
INNER JOIN [Table 2] t2
ON t1.User = t2.UserName
INSERT INTO [Table 1] ( User, InternetAmountDue )
SELECT UserName, AmountDue
FROM [Table 2] t2
LEFT OUTER JOIN [Table 1] t1
ON t1.User = t2.UserName
WHERE t1.User IS NULL
答案 4 :(得分:0)
查看UPSERT声明。这可能就是你要找的东西。
答案 5 :(得分:0)
如果通过ID而不是名称完成,这将最快。由于您按名称加入,因此性能会下降并可能出现重复。
解决了重复并准备好进行更新后,您应该:
您应首先执行更新 然后执行插入
考虑重新编制索引