动态拼接 merge 语句

news2025/7/11 9:44:30

【问题】

Hello everyone, 
I have one query, would be great if anyone can help me out on this.
In SQL, I have two tables with same column names. Want to query if there is any difference in the column values and if yes will update the values(in the first table) else if the row is not found will insert the row using the MERGE statement. 
As of now, I have to mention all the columns in the tables and match by the values.
Eg: If the tables are like this:
Table1 (A,B,C,D...)
Table2 (A,B,C,D...)
The query would be like this : 
MERBE INTO Table1 as TabA
USING (Select * from Table2) AS TabB
ON TabA.A=TabB.A 
AND TabA.B=TabB.B
AND TabA.C=Tab.C
AND TabA.D=TabB.D
...
...
When Matched Then 
Update
Set TabA.A=TabB.A,
, TabA.B=TabB.B
, TabA.C=TabB.C
, TabA.D=TabB.D
..
..
..
When NOT Matched Then
Insert Values (TabB.A,TabB.B,TabB.C, TabB.D..)
But I want the column names to be fetched dynamically so that everytime the column name changes or a new column is added , we dont have to rewrite the query(considering there are a lot of columns in the tables to be matched)
Please let me know if you want me to rephrase my sentence to make my statement clear .

【回答】

       表结构未知时,依靠存储过程拼出动态的MERGE语句非常麻烦,如果用SPL来拼,脚本要短许多:

首先定义参数source和target,便于动态指定表名

A
1=myDB1.query("select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE k where k.TABLE_NAME='"+source+"'")
2=pks=A1.(COLUMN_NAME)
3=myDB1.query("select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS c where c.TABLE_NAME='"+source+"'")
4=columns=A3.(COLUMN_NAME)
5

="MERGE INTO"+target+" as t"+

"USING"+source+"as s "+

"ON"+pks.("t." + ~ + "=s." + ~).concat("and")+

"WHEN MATCHED"+

"THEN UPDATE SET "+(columns\pks).("t." + ~ +"=s." + ~).concat@c()+

"WHEN NOT MATCHED"+

"THEN INSERT VALUES("+columns.("s."+ ~).concat@c()+")"

6=myDB1.excute(A5)

A1:从系统表获取source表的主键,每个数据库获取主键方式不同,这里以MSSQL为例

A2:将主键组成的序列保存到变量pks中,形如["A","B"]

A3:检索source所有列

A4:将列名组成的序列保存到变量columns中,形如["A","B","C","D"]

A5:动态拼接merge语句

pks.("t." + ~ + "=s." + ~).concat("and")对序列pks循环计算,将计算后的序列成员拼成and连接的字符串,形如:t.A=s.A and t.B=s.B

(columns\pks).("t." + ~ +"=s." + ~).concat@c(),首先针对columns和pks求差列,获取非主键字段组成的序列,再对该序列循环计算,将计算后的序列成员拼成逗号连接的字符串,形如:t.C=s.C,t.D=s.D

columns.("s."+ ~).concat@c()同理拼成形如s.A,s.B,s.C,s.D的字符串

A6:执行A5返回的merge语句

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LEADTOOLS 入门教程: 使用 AWS Lambda 转换文档 - C# .NET Core

LEADTOOLS 是一个综合工具包的集合,用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和处理&#…

SSM框架真没那么难,这份阿里大佬的进阶实战笔记真给讲透了!

SSM框架: SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现…

Docker学习笔记

1.docker比vm快的原因: docker有着比虚拟机更少的抽象层,不需要实现硬件资源的虚拟化运行,运行在docker上的程序使用的都是物理机的资源. dicker利用的是宿主机的内核,不需要加载操作系统的os内核. 2.docker帮助文档docker help 具体到某一个命令是使用 docker run --help即可…

【JMeter】Jmeter分布式压测教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、原理二、环境搭建2.1 环境准备2.2 slave机器配置2.3 master机器配置三、脚本及执行3.1 参数化问题3.2 GUI启动测试3.3 命令行启动测试总结一、原理 Jmeter分布式…

【深入理解Kotlin协程】CoroutineScope.launch源码追踪扒皮

lifecycleScope、viewModelScope、GlobalScope、MainScope的上下文 协程最重要的就是协程上下文对象,因为通过上下文可以获取到协程相关的任何东西(Job、Dispatcher、Interceptor、Name、ExceptionHandler),所以有必要了解清楚常用的协程作用域对象中cor…

asp.net+sqlserver汽车4s店销售网站系统c#项目

数据项 管理员信息表{用户编号,用户名称,用户密码} 新闻信息表{编号,标题,内容,添加时间} 汽车信息表{编号,汽车名称,汽车价格&#x…

制造业行业现状及智能生产管理系统一体化解决方案

前言: 《中国制造2025》作为我国实施制造强国战略第一个十年的行动纲领。它重点提出了坚持:创新驱动、质量为先、绿色发展、结构优化、人才为本的基本方针。坚持:市场主导、政策引导,立足当前、着眼长远,整体推进、重…

Selenium实现原理

Selenium 是目前主流的用于Web应用程序测试的工具,可以直接运行在浏览器中,就像真正的用户在操作一样。 selenium的实现原理是这样的: 1.运行代码,启动浏览器后,webdriver会将浏览器绑定到特定端口,作为we…

[go学习笔记.第十五章.反射] 1.反射的基本介绍以及实践

一.反射的引入以及基本介绍 1.看两个问题 (1).对于结构体的序列化和反序列化,看一段代码 package mainimport("fmt" "encoding/josn" )type Monster struct {Name string json:"monsterName"Age int json:"monsterAge&quo…

deque容器(20221115)

1、基本概念 功能:双端数组,可以对头端进行插入删除元素 deque与vector的区别: vector对应头部的插入删除效率低,数据量越大,效率越低 deque对头部的插入删除速度比vector快 vector访问元素速度比deque快 deque内…

sanic 教程

sanic 教程 在Sanic的生命周期流程大致如下: http请求——Sanic解析request——匹配路由——请求中间件——视图函数——响应中间件——http响应 依赖库 sanic21.3.4 sanic-jwt1.7.0 sanic-openapi21.12.0 gunicorn20.1.0 PyMySQL1.0.2 aiomysql0.1.1 DBUtils1.3…

WPS(WSC)中M1 到M8 图解

背景 之前实习的时候就学了Wifi p2p相关的东西,当时找M1到M8的功能把我累惨了,找到的还全是千篇一律的东西,讲的不是很清楚(当然原版出书的那个前辈肯定是懂的),但是对我等小白不友好,就萌生了这…

3.线性代数-矩阵

矩阵和Tensor1. Tensor2.矩阵3.线性代数正确打开方式3.1 行视图3.2 列视图4.线性相关和线性无关5. Span、基和子空间(Subspace)6.四个基本的子空间6.1 列空间6.2 零空间6.3 行空间6.4 左零空间6.5 四个基本子空间的关系7.可逆矩阵8.方阵的特征值与特征向量9.特征分解9.1一般矩阵…

【Pytorch with fastai】第 7 章 :训练SOTA的模型

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

Nginx优化方案

目录 一、Nginx返回错误页面 1、HTTP常见状态代码列表 二、Nginx状态页面 1、安装status模块 2、激活status 三、优化并发连接数 1、压力测试软件ab(http-tools) 2、优化并发连接数 2.1、修改nginx并发数 2.2、修改内核最大文件数量 四、Nginx…

吉莱斯皮随机模拟算法(SSA)(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【K8S系列】第十讲:Knative 简介

目录 一、 Serverless介绍 二、Knative 介绍 2.1 Knative 的定位 2.2 Knative的组成 2.2.1 Build 构建系统 2.2.2 Serving:服务系统 2.2.3 Eventing:事件系统 补充: 三、总结: 一、 Serverless介绍 在讲Knative之前&a…

【毕业设计】机器视觉手势检测和识别系统 - python 深度学习

文章目录0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构4 最后0 前…

线程池源码解析 2.工作原理与内部结构

线程池源码解析—工作原理与内部结构 工作原理 概述 线程池是线程的池子,本质上是通过单个线程执行多个并发任务,使得尽量少的创建线程,减少开销。在线程池内部,是没有区分核心线程和非核心线程的,是通过 Set 集合的…

拒绝内卷,阿里架构师整理的这份Java核心手册,堪称最强

2022年注定是不寻常的一年,在今年因为疫情以及各大大厂纷纷传来裁员的消息,引得整个互联网圈动荡不堪。腾讯裁员30%、京东、百度、字节等大厂都在纷纷裁员,引的这些中厂和小厂也跟风裁员。 这个时候外部的各种变化愈发证明一个重要的一点&am…