查询不同数据库的两张表合并在一起,以某个字段为主键合并同主键的行
时间: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
- Python:numpy总结(4)
- Python: numpy总结(2)
- class 类—老司机的必修课 | 统计师的Python日记 第11课
- Python:matplotlib
- Python: matplotlib安装
- Java后端实现图片压缩技术(赞赏功能已开通,欢迎测试,噗~!)
- 我是如何得知10W+的访问量多来自工作日的 | 塔秘
- 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
- 【技术专栏】OpenVirteX体系结构之组件(一)
- 洞察 | 深圳数据分析师的职业前景如何?爬完拉勾数据给你分析 (附代码和过程)
- 【温故】金融数据挖掘之朴素贝叶斯
- 为你的网站加上SSL,可以使用HTTPS进行访问
- LeeCX - 开源后台管理系统简单介绍
- fastdfs 图片服务器 使用java端作为客户端上传图片
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法