如何使这个SQL任务更快完成

时间:2009-06-30 16:57:23

标签: sql sql-server sql-server-2008

假设表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. 如果表1中存在用户,请更新InternetAmountDue列
  2. 否则,请插入新用户
  3. 输出

    表1

    Id    User   InternetAmountDue
    1     joe    21.00
    2     kay    21.00
    

    如果涉及大量数据,如何快速完成?

6 个答案:

答案 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而不是名称完成,这将最快。由于您按名称加入,因此性能会下降并可能出现重复。

解决了重复并准备好进行更新后,您应该:

您应首先执行更新 然后执行插入

考虑重新编制索引