微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从临时表更新表

如何解决从临时表更新表

标准方法是先执行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

您可能还需要删除或将不再存在于tmp中的任何药物记录标记为已删除。将其作为与UPDATE相同的单独语句来执行,但要使用LEFT OUTER JOIN,其中tmp.TradENAME为NULL。

解决方法

我有一个表,用于存储处方药信息,并且需要每天从中央处方中心进行更新。临时表与药物表相同。临时表数据可能与主表相同(并且大多数情况下会如此),或者它可能具有更新的行或新的行。

我有一个存储过程来更新主表,但是失败了,因为它不会更新NULL行(如果临时表中有新行)。

这是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]

编辑:

我去了罗里的代码。谢谢,效果很好。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。