SQL中的临时表,MERGE INTO和UPDATE 将一个表的字段更新到另一个表

 1 ALTER PROC [dbo].[pro_med_records_sync]
 2 AS
 3 BEGIN
 4 select distinct 病人号,身份证号护照号 into #tt from [192.168.101.33].[rmlis6].[dbo].[接口视图_申请单主表] where 申请日期 > cast(convert(varchar(10),getdate(),120) + ' 00:00:00' as datetime)
 5 
 6   --患者同步
 7     select distinct 病人号,身份证号护照号 into #tt from [192.168.101.33].[rmlis6].[dbo].[接口视图_申请单主表] where 申请日期 > cast(convert(varchar(10),getdate(),120) + ' 00:00:00' as datetime)
 8     MERGE INTO [dbo].Yy_MedRecords t
 9     USING(SELECT  
10  *
11  FROM
12 OPENQUERY(HIS_DB,'SELECT  PATIENTID, VISITID, ZYH, BEDNO, PATNAME, BIRTHDAY, SEX, PAT_STATUS, 
13 CHARGE_TYPE, NURSE_CLASS, IN_HOS_TIME, DISGNOSE, DOCTORCODE, DOCTORNAME, DEPT_CODE, DEPT_NAME,
14  WARD_CODE, WARD_NAME, PREPAYMENTS, TOTAL_COSTS, VEDLOCK, JOB, ADDRESS, NATION, COMPANY, TEL, 
15  CONTACT, RELATION, RETEL FROM NEXTCARE.VIEW_PATIENTS_INFO  WHERE STATUS = ''在院''')) AS ht 
16     ON t.InPatNo = ht.ZYH collate Chinese_PRC_CI_AS
17     WHEN MATCHED THEN
18         UPDATE SET t.PatName = ht.PATNAME,
19                    t.Sex =  ht.SEX,
20                    t.DiagValue = ht.DISGNOSE,
21                    t.Age=CASE WHEN DATEDIFF(YEAR,ht.BIRTHDAY,GETDATE())>0 THEN CONVERT(varchar,DATEDIFF(YEAR,ht.BIRTHDAY,GETDATE()))+''
22                               WHEN DATEDIFF(MONTH,ht.BIRTHDAY,GETDATE())=0
23                                 THEN CONVERT(varchar,DATEDIFF(DAY,ht.BIRTHDAY,GETDATE()))+''    
24                             ELSE CONVERT(varchar,DATEDIFF(MONTH,ht.BIRTHDAY,GETDATE()))+'个月' END,
25                    t.IDNum = CASE WHEN t.IDNumis  null THEN (select Convert(varchar(100),a.身份证号护照号 collate Chinese_PRC_CI_AS) from #tt as a where a.病人号 = ht.PATIENTID) 
26                             ELSE t.IDNum END,
27                    t.InPatNo=ht.ZYH
28                                  
29 
30     WHEN NOT MATCHED BY TARGET THEN

1.SqlServer中临时表的应用

  上面的存储过程用来同步医院患者信息,需要从LIS系统的检验申请单表中获取患者的身份证号,由于LIS检验申请表数据量过大,如果每次匹配更改,插入操作都从LIS数据库中查询,太耗费时间.

  为了解决上面的问题,通过临时表来优化上面的Sql语句.将符合条件的LIS申请单相关字段导入到临时表中,再在每次匹配操作时从临时表中查询.

  下面说一下临时表的操作:

    1.1全局临时表和局部临时表:

      全局临时表通过##t 来标记,而局部临时表通过#t标记,二者区别主要在于临时表失效时间,写在存储过程中的局部临时表在存储过程执行完后就自动失效,而全局临时表只有在SqlServer服务重启时才失效

    1.2怎样创建临时表

      select * into #t from table

2.MERGE INFO语句

    2.1MERGE INTO语句的用法:

      MERGE INTO语句用于表的同步,即将源表中的数据同步到目标表中,具体是对源表和目标表中能够匹配的行进行修改,对目标表中不存在而原表中存在的行进行插入,对原表中存在而目标表中不存在的行进行删除

    2.2

      MERGE INTO Target_Table as T

      USING Source_Table as S

      on T.Id = S.Id

      WHEN MATCHED THNE 

        Update set T.Name = S.name

      WHEN NOT MATCHED BY TARGET THNE

        Insert .......

      WHEN NOT MATCHED BY SOURCE THEN

        Delete.../Update...

3.UPDATE 将一个表的字段更新到另一个表

UPDATE  a SET a.DocId =b.F_Id FROM Yy_MedRecords a, dbo.Sys_User b WHERE a.DocCode=b.F_Account    

将一个表中的数据更新到另一个表中,方法如上

另一中写法:

  UPDATE A
      SET A1 = B1, A2 = B2, A3 = B3
      FROM A LEFT JOIN B ON A.ID = B.ID

   此处也可以 right join 、 inner join

  

    

猜你喜欢

转载自www.cnblogs.com/alan-1996/p/12617697.html
今日推荐