比较sqlserver中两个表的行

时间:2013-06-06 15:36:27

标签: sql sql-server stored-procedures cursor

任何人都可以为我提供以下问题的代码:

我在sql server中有两个表。两个表都具有相同数量的字段和字段名称。如果我将这两个表视为ActualData和TempData,我需要使用“databaseID”列更新ActualData表中的数据与TempData中的数据,即例如,如果遵循TempData表

DatabaseID | FirstName |  MiddleName    
277459 | VALINDA | CLAY         
283934 | LAURA | MARIE          
2.7E+13 | Jamie | Hawley

我需要在ActualData表中找到与TempData中的行具有相同databaseID的行,并将整个记录替换为TempData表中记录的行。如果我们在ActualData中找不到记录,然后我们需要将TempData中的记录添加到ActualData中。这需要对TempData中的所有记录进行。 我怎么能这样做?

4 个答案:

答案 0 :(得分:0)

听起来你只想要一个带有JOIN的更新:

UPDATE A
SET
    A.FirstName = B.FirstName 
   ,A.MiddleName = B.Middlename
FROM
    ActualData A
    JOIN
    TempData B ON A.databaseID = B.databaseID

一个INSERT:

INSERT INTO ActualData 
SELECT *
FROM TempData 
WHERE databaseID  NOT IN (SELECT DISTINCT databaseID  FROM ActualData)

鉴于您有110个字段,您可能想要删除然后INSERT,因为您可以同时执行这两个操作而不列出列:

DELETE FROM ActualData 
WHERE databaseID  IN (SELECT DISTINCT databaseID FROM ActualData)

然后在DELETE之后执行上面的INSERT。不知道是否有办法在没有列出列的情况下使用JOIN更新。

答案 1 :(得分:0)

试试这个:

 update ad
 set FirstName = td.FirstName,
     Middlename = td.MiddleName
 from ActualData ad
 inner join TempData td
 on ad.DatabaseID = td.DatabaseId
 where ad.FirstName != td.FirstName or ad.MiddleName != td.MiddleName

 insert into ActualData (DatabaseId, FirstName, MiddleName)
 select td.DatabaseId, td.FirstName, td.MiddleName
 from TempData td 
 left outer join ActualData ad on td.DatabaseId = ad.DatabaseId
 where ad.DatabaseId is null

答案 2 :(得分:0)

Update a Set
     FirstName = t.FirstName,
     LastName = t.LastName,
     etc.
From ActualData a
    Join TempData t
        On t.DatabaseId = a.DatabaseId
-- -----------------------------------
Insert ActualData(DatabaseId, 
    FirstName, LastName,
    etc. ...)
Select DatabaseId, 
    FirstName, LastName,
    etc.
From tempData t
Where Not exists
    (Select * From ActualData
     DatabaseId = t.DatabaseId)

答案 3 :(得分:0)

使用像这样的更新/插入命令(与sql 2000及更高版本兼容)

Update ActualData
Set FirstName = TempData.FirstName,
MiddleName = TempData.MiddleName
FROM ActualData
INNER JOIN TempData ON ActualData.DatabaseId = TempData.DatabaseId

insert into ActualData(DatabaseId, FirstName, MiddleName)
SELECT TempData.DatabaseId, TempData.FirstName, TempData.MiddleName
FROM TempData
LEFT OUTER JOIN ActualData ON ActualData.DatabaseId = TempData.DatabaseId
WHERE ActualData.DatabaseId IS NULL

或者您可以使用合并命令