查询不同数据库的两张表合并在一起,以某个字段为主键合并同主键的行

时间:2019-10-22
本文章向大家介绍查询不同数据库的两张表合并在一起,以某个字段为主键合并同主键的行,主要包括查询不同数据库的两张表合并在一起,以某个字段为主键合并同主键的行使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一.背景

今日接到一个需求,需要统计AB两个库中表的数据然后合并到一起。

需要查询的两个库的结构一致,所以同事只给了其中一个库的查询语句,剩下的查询整理需要自己写。

首先看一下原始的数据

  原始取数语句

SELECT  distinct ( ltrim(rtrim(a.charge_code))+','+ltrim(rtrim(a.serial))+','+ltrim(rtrim(a.group_no))) AS drugMainKey,
        a.drugname AS     drugCommName,    
        (case when isnull(y.drugname,'')='' then a.drugname else y.drugname end)   AS   drugName,
                    
        a.specification AS     drugspecs,
        b.unit AS     drugUnit,        
        e.dosaname AS     drugFrom,
        c.manu_name AS factoryName    ,
        a.charge_code AS charge_code,        
        a.serial AS packSeqNo,
        a.group_no as pharmacyCode,
        z.ybbm 
FROM    yp_mz_base a
        LEFT JOIN yp_base f ON a.charge_code = f.charge_code
        LEFT JOIN dbo.yp_unit b ON a.mini_unit = b.code
        LEFT JOIN dbo.yp_manufacture c ON f.manufactory = c.manu_code
        LEFT JOIN dbo.yp_dosage e ON f.dosage = e.dosacode
        LEFT JOIN dbo.yp_drugname  y ON a.drug_id_link   = y.drug_id  and y.flag ='b'
        LEFT JOIN dbo.zd_ybdzyp z on a.charge_code=z.charge_code and a.serial=z.serial

(A库和B库查出来的数据结构一致,就不重复贴图了)

二.要求

①.对于A库查到的数据的字段drugmainkey的值末尾加'1'结尾,对于B库查到的数据的字段drugMainKey的值末尾加‘2’结尾,并且和原数据之间用‘,’分隔,将处理后的数据放在一起。

②.对于drugMainKey相同的行进行合并,合并后的drugname为各行的drugname的合集,用‘,’连接在一起。(因为除了drugname以外的其他字段值都是相同的,所以不需要做操作)

处理后的数据的效果图为:

这个问题可以用游标来操作,也可以用笨方法采取两步走的笨方法处理数据。

这里我用的是笨方法。

2.1.1先建立表一,用来存放①中的数据。

表一:

2.1.2 实现①的要求

  这个没什么好说的,涉及到两个表用union all,以及字符串的拼接。

SELECT  distinct ( ltrim(rtrim(a.charge_code))+','+ltrim(rtrim(a.serial))+','+ltrim(rtrim(a.group_no))+','+'1') AS drugMainKey,
        a.drugname AS     drugCommName,    
        (case when isnull(y.drugname,'')='' then a.drugname else y.drugname end)   AS   drugName,
                    
        a.specification AS     drugspecs,
        ltrim(rtrim(b.unit)) AS     drugUnit,
        e.dosaname AS     drugFrom,
        c.manu_name AS factoryName    ,
        a.charge_code AS charge_code,        
        a.serial AS packSeqNo,
        a.group_no as pharmacyCode,
        z.ybbm,
        a.pack_size AS packSize,  /*新增1*/
        ltrim(rtrim(p.unit))AS drugUnit2  /*新增2*/
        /*p.unit AS drugUnit2       新增2*/    
FROM    sdyychisdb_sz.dbo.yp_mz_base a
        LEFT JOIN sdyychisdb_sz.dbo.yp_base f ON a.charge_code = f.charge_code
        LEFT JOIN sdyychisdb_sz.dbo.yp_unit b ON a.mini_unit = b.code
        LEFT JOIN sdyychisdb_sz.dbo.yp_unit p ON a.pack_unit = p.code     /*新增3*/    
        LEFT JOIN sdyychisdb_sz.dbo.yp_manufacture c ON f.manufactory = c.manu_code
        LEFT JOIN sdyychisdb_sz.dbo.yp_dosage e ON f.dosage = e.dosacode
        LEFT JOIN sdyychisdb_sz.dbo.yp_drugname  y ON a.drug_id_link   = y.drug_id  and y.flag ='b'
        LEFT JOIN sdyychisdb_sz.dbo.zd_ybdzyp z on a.charge_code=z.charge_code and a.serial=z.serial
UNION all
SELECT  distinct ( ltrim(rtrim(pa.charge_code))+','+ltrim(rtrim(pa.serial))+','+ltrim(rtrim(pa.group_no))+','+'2') AS drugMainKey,
        pa.drugname AS     drugCommName,    
        (case when isnull(py.drugname,'')='' then pa.drugname else py.drugname end)   AS   drugName,
                    
        pa.specification AS     drugspecs,
        ltrim(rtrim(pb.unit)) AS     drugUnit,    
        pe.dosaname AS     drugFrom,
        pc.manu_name AS factoryName    ,
        pa.charge_code AS charge_code,        
        pa.serial AS packSeqNo,
        pa.group_no as pharmacyCode,
        pz.ybbm,
        pa.pack_size AS packSize,  /*新增1*/
        ltrim(rtrim(pp.unit))AS drugUnit2  /*新增2*/
        /*pp.unit AS drugUnit2      新增2*/        
FROM    sdyychisdb_pj.dbo.yp_mz_base pa
        LEFT JOIN sdyychisdb_sz.dbo.yp_base pf ON pa.charge_code = pf.charge_code
        LEFT JOIN sdyychisdb_sz.dbo.yp_unit pb ON pa.mini_unit = pb.code
        LEFT JOIN sdyychisdb_sz.dbo.yp_unit pp ON pa.pack_unit = pp.code     /*新增3*/    
        LEFT JOIN sdyychisdb_sz.dbo.yp_manufacture pc ON pf.manufactory = pc.manu_code
        LEFT JOIN sdyychisdb_sz.dbo.yp_dosage pe ON pf.dosage = pe.dosacode
        LEFT JOIN sdyychisdb_sz.dbo.yp_drugname  py ON pa.drug_id_link   = py.drug_id  and py.flag ='b'
        LEFT JOIN sdyychisdb_sz.dbo.zd_ybdzyp pz on pa.charge_code=pz.charge_code and pa.serial=pz.serial
order by drugMainKey

2.2.1再建立表二,用来存放②中的数据。

表二

2.2.2代码实现②

select B.drugMainKey,B.drugCommName,
left(namelist,len(namelist)-1)as drugname,B.drugsecs,concat(B.packSize,B.drugUnit,'/',B.drugUnit2)as drugUnit,B.drugFrom,B.factoryName,B.charge_code,B.packSeqNo,B.phamacyCode,B.ybbm,B.packSize,B.drugUnit2 from 
(
 select drugMainKey,drugCommName,drugsecs,drugUnit,drugFrom,factoryName,charge_code,packSeqNo,phamacyCode,ybbm,packSize,drugUnit2,
 (select  ltrim(rtrim(drugName))+',' from xlyyp
where drugMainKey=A.drugMainKey
for xml path('')) as namelist
from xlyyp A
group by drugMainKey,drugCommName,drugsecs,drugUnit,drugFrom,factoryName,charge_code,packSeqNo,phamacyCode,ybbm,packSize,drugUnit2
)B
ORDER BY drugMainKey DESC

对于for xml path的用法的理解,可以参考另外一位园友的帖子。

https://www.cnblogs.com/yasuo2/p/6433697.html

原文地址:https://www.cnblogs.com/kingsgao/p/11720590.html