从临时表更新一张表

4
我有一个表格存储处方药信息,需要每天从中央处方表更新。临时表与药品表完全相同。临时表数据可能与主表完全相同(大多数情况下如此),也可能具有更新行或新行。
我有一个存储过程来更新主表,但它失败了,因为它不会更新空行(如果临时表中有新行)。
这是MSSQL Server 2005。
我的错误在哪里?
    -- Insert statements for procedure here
UPDATE [RX_Billing].[dbo].[FS_Drug]
SET [TRADENAME] = [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME]
  ,[CDM] = [RX_Billing].[dbo].[FS_Drug_TEMP].[CDM]
  ,[NDC] = [RX_Billing].[dbo].[FS_Drug_TEMP].[NDC]
  ,[IP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[IP_COST]
  ,[OP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[OP_COST]
  ,[HH_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[HH_COST]
  ,[VAR_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[VAR_COST]
  ,[LSTUPDATE] = [RX_Billing].[dbo].[FS_Drug_TEMP].[LSTUPDATE]
FROM [RX_Billing].[dbo].[FS_Drug]
RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] ON 
          [RX_Billing].[dbo].[FS_Drug].[TRADENAME] = 
                   [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME]

编辑:

我采用了Rory的代码。谢谢,它工作得很好。

给Orion Edwards的一条注释:UPSERT / MERGE正是我想要的,但它不支持SQL Server 2005。显然,这是计划中的,但并没有在该版本中实现。它在Server 2008中可用。(根据Interwebs告诉我的内容。)

3个回答

13

标准的做法是先执行UPDATE,然后再执行INSERT:

-- UPDATE rows using an INNER JOIN with matching TRADENAME. No need to update TRADENAME column.
UPDATE drug
SET [CDM] = tmp.[CDM]
  , [NDC] = tmp.[NDC]
  , [IP_COST] = tmp.[IP_COST]
  , [OP_COST] = tmp.[OP_COST]
  , [HH_COST] = tmp.[HH_COST]
  , [VAR_COST] = tmp.[VAR_COST]
  , [LSTUPDATE] = tmp.[LSTUPDATE]
FROM [RX_Billing].[dbo].[FS_Drug] drug
INNER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp  
    ON drug.[TRADENAME] = tmp.[TRADENAME]

-- Insert rows that don't have matching TRADENAME
INSERT INTO drug
SELECT 
    tmp.[TRADENAME]
  , tmp.[CDM]
  , tmp.[NDC]
  , tmp.[IP_COST]
  , tmp.[OP_COST]
  , tmp.[HH_COST]
  , tmp.[VAR_COST]
  , tmp.[LSTUPDATE]
FROM [RX_Billing].[dbo].[FS_Drug] drug
RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp 
    ON  drug.[TRADENAME] = tmp.[TRADENAME]
WHERE drug.[TRADENAME] IS NULL 

您可能还想删除或标记 drug 表中不再在 tmp 表中的任何记录。用一个单独的语句执行此操作,与 UPDATE 相同,但使用 LEFT OUTER JOIN,其中 tmp.TRADENAME 为 NULL。


4

这个链接已经失效了。 - Greg Barth
1
谢谢。已将其更新为指向 MS 文档,这应该更加稳定。 - Orion Edwards

2

你是否希望对新行进行插入操作,对现有行进行更新操作?如果我理解正确,将其更新为INNER JOIN,并添加单独的INSERT应该可以解决您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接