回答

收藏

从临时表更新表

技术问答 技术问答 468 人阅读 | 0 人回复 | 2023-09-12

我有一个存储处方药信息的表,需要每天从中央处方中心更新。临时表与药物表相同。临时表数据可能与主表相同(在大多数情况下),或者可能有更新线或新线。
. a6 R4 V# M" I5 n( ~; y我有一个更新主表的存储过程,但它失败了,因为它不会更新NULL行(如果临时表中有新行)。
# @  U9 V; Y/ o$ n2 J这是MSSQL Server 2005。
2 \2 ?9 O: ?; \% f6 T5 F这里我在哪里错了:
* W- c( ^1 }  J/ m. A                -- Insert statements for procedure hereUPDATE [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]编辑:' c: N6 J8 b" r. ^2 Y. {. g; I# x
我去了罗里的代码。谢谢,效果很好。4 x7 |" ]' v6 U& {
给Orion Edwards的注释:UPSERT / MERGE正是我想要的,但是SQL Server9 o3 _' n% b4 U/ a* I  t6 f
2005不支持。显然是计划好的,但是没有发布这个版本。Server 2008年可用。Interwebs告诉我内容。
3 H  @7 f* B% i3 P0 T- G                                                               
  g1 a+ H# i- l# f( {    解决方案:                                                                9 D2 |8 q, R8 m) C0 B3 r
                                                                先执行标准方法UPDATE,然后执行INSERT:
/ C+ [7 S4 v) Y. S* l  N2 v-- UPDATE rows using an INNER JOIN with matching TRADENAME. No need to update TRADENAME column.UPDATE drugSET [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] drugINNER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp      ON drug.[TRADENAME] = tmp.[TRADENAME]-- Insert rows that don't have matching TRADENAMEINSERT INTO drugSELECT     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] drugRIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp     ON  drug.[TRADENAME] = tmp.[TRADENAME]WHERE drug.[TRADENAME] IS NULL您可能需要删除或不再存在tmp中间的任何药物记录都被删除了。UPDATE执行相同的单独语句,但应使用LEFT OUTER
. q8 j. Q) P) PJOIN,其中tmp.TRADENAME为NULL。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则