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

一.背景

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

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

首先看一下原始的数据

原始取数语句

SELECT distinct ( ltrim(rtrim(a.charge_code))+‘,‘+ltrim(rtrim(a.serial))+‘,‘+ltrim(rtrim(a.group_no))) ASdrugMainKey,

a.drugnameASdrugCommName,

(case when isnull(y.drugname,‘‘)=‘‘ then a.drugname else y.drugname end) ASdrugName,

a.specificationASdrugspecs,

b.unitASdrugUnit,

e.dosanameASdrugFrom,

c.manu_nameASfactoryName ,

a.charge_codeAScharge_code,

a.serialASpackSeqNo,

a.group_noaspharmacyCode,

z.ybbmFROMyp_mz_base aLEFT JOIN yp_base f ON a.charge_code =f.charge_codeLEFT JOIN dbo.yp_unit b ON a.mini_unit =b.codeLEFT JOIN dbo.yp_manufacture c ON f.manufactory =c.manu_codeLEFT JOIN dbo.yp_dosage e ON f.dosage =e.dosacodeLEFT 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

5f860f801b7478246f03fb79124bd666.png

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

二.要求

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

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

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

a5cf5d7e1e932d9e32df9bc75a40fb18.png

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

这里我用的是笨方法。

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

表一:

746d4a20f9faf9206666a865d7402114.png

2.1.2 实现①的要求

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

SELECT distinct ( ltrim(rtrim(a.charge_code))+‘,‘+ltrim(rtrim(a.serial))+‘,‘+ltrim(rtrim(a.group_no))+‘,‘+‘1‘) ASdrugMainKey,

a.drugnameASdrugCommName,

(case when isnull(y.drugname,‘‘)=‘‘ then a.drugname else y.drugname end) ASdrugName,

a.specificationASdrugspecs,ltrim(rtrim(b.unit)) ASdrugUnit,

e.dosanameASdrugFrom,

c.manu_nameASfactoryName ,

a.charge_codeAScharge_code,

a.serialASpackSeqNo,

a.group_noaspharmacyCode,

z.ybbm,

a.pack_sizeAS packSize, /*新增1*/

ltrim(rtrim(p.unit))AS drugUnit2 /*新增2*/

/*p.unit AS drugUnit2 新增2*/

FROMsdyychisdb_sz.dbo.yp_mz_base aLEFT JOIN sdyychisdb_sz.dbo.yp_base f ON a.charge_code =f.charge_codeLEFT JOIN sdyychisdb_sz.dbo.yp_unit b ON a.mini_unit =b.codeLEFT 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_codeLEFT JOIN sdyychisdb_sz.dbo.yp_dosage e ON f.dosage =e.dosacodeLEFT 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.serialUNION all

SELECT distinct ( ltrim(rtrim(pa.charge_code))+‘,‘+ltrim(rtrim(pa.serial))+‘,‘+ltrim(rtrim(pa.group_no))+‘,‘+‘2‘) ASdrugMainKey,

pa.drugnameASdrugCommName,

(case when isnull(py.drugname,‘‘)=‘‘ then pa.drugname else py.drugname end) ASdrugName,

pa.specificationASdrugspecs,ltrim(rtrim(pb.unit)) ASdrugUnit,

pe.dosanameASdrugFrom,

pc.manu_nameASfactoryName ,

pa.charge_codeAScharge_code,

pa.serialASpackSeqNo,

pa.group_noaspharmacyCode,

pz.ybbm,

pa.pack_sizeAS packSize, /*新增1*/

ltrim(rtrim(pp.unit))AS drugUnit2 /*新增2*/

/*pp.unit AS drugUnit2 新增2*/

FROMsdyychisdb_pj.dbo.yp_mz_base paLEFT JOIN sdyychisdb_sz.dbo.yp_base pf ON pa.charge_code =pf.charge_codeLEFT JOIN sdyychisdb_sz.dbo.yp_unit pb ON pa.mini_unit =pb.codeLEFT 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_codeLEFT JOIN sdyychisdb_sz.dbo.yp_dosage pe ON pf.dosage =pe.dosacodeLEFT 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.serialorder by drugMainKey

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

表二

368c5b808460d7ac0c2cd05f65141427.png

2.2.2代码实现②

selectB.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(selectdrugMainKey,drugCommName,drugsecs,drugUnit,drugFrom,factoryName,charge_code,packSeqNo,phamacyCode,ybbm,packSize,drugUnit2,

(select ltrim(rtrim(drugName))+‘,‘ fromxlyypwhere drugMainKey=A.drugMainKeyfor xml path(‘‘)) asnamelistfromxlyyp Agroup bydrugMainKey,drugCommName,drugsecs,drugUnit,drugFrom,factoryName,charge_code,packSeqNo,phamacyCode,ybbm,packSize,drugUnit2

)BORDER BY drugMainKey DESC

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值