-1

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

我在 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

4 回答 4

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)
于 2013-06-06T15:44:19.120 回答
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

或者你可以使用合并命令

于 2013-06-06T15:45:26.613 回答
0

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

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

和一个插入:

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

鉴于您有 110 个字段,您可能希望先删除然后插入,因为您可以在不列出列的情况下同时执行这两个操作:

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

然后在 DELETE 之后执行上面的 INSERT。不知道是否有一种方法可以在不列出列的情况下使用 JOIN 进行更新。

于 2013-06-06T15:41:01.783 回答
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
于 2013-06-06T15:41:40.690 回答