`
shmily_zjl
  • 浏览: 8473 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

MERGE命令使用

阅读更多
Oracle9i引入了MERGE命令,使我们能够在一个SQL语句中对一个表同时执行inserts和updates操作,MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.最近工作中需要处理一批号码数据.之前数据库中有一个号码的黑名单,用户信息群发的黑名单用户过滤,表格字段如下
black_dn( dn varchar(13),flag number(2))

此表格中保存了一份号码黑名单数据,dn为号码,flag为地市标志.现在又有了一份黑名单.这份黑名单中可能有重复的,可能有之前已经导入到黑名单表格中的.需要把这份黑名单无重复的添加近black_dn表中于是我按照black_dn创建了一个新的表
create balck_dn_new as select * from black_dn where 0=1;

然后将新的数据使用sqlload全部导入到新的表中,接着我需要更新black_dn中的数据,于是使用了如下的SQL
MERGE INTO BLAKC_DN B1
USING BLACK_DN_NEW B2
ON (B1.DN=B2.DN AND B1.FLAG=B2.FLAG)
WHEN MATCHED THEN
UPDATE SET
B1.DN=B2.DN
B1.FLAG=B2.FLAG
WHEN NOT MATCHED THEN
INSERT VALUES(B2.DN,B2.FLAG); 

但是数据库反馈了ORA-00904: "B1"."DN": 无效的标识符,刚开始非常想不通为什么会提示这个错误.明明字段是没有错误的.于是乎又是找了一通资料,发现了问题所在,如果你在on后引用了哪些列,这些列是不允许更新的.但是oracle这个提示错误个人觉得是有问题的.为了正确使用,我又为把balck_dn表扩展为
BLACK_DN (DN VARCHAR(13),FLAG NUMBER(2),IFLAG NUMBER(2))

在IFLAG字段中全部填入了0,然后修改了SQL
MERGE INTO BLAKC_DN B1
USING BLACK_DN_NEW B2
ON (B1.DN=B2.DN AND B1.FLAG=B2.FLAG)
WHEN MATCHED THEN
UPDATE SET
B1.IFLAG=10
WHEN NOT MATCHED THEN
INSERT VALUES(B2.DN,B2.FLAG,1);

本以为OK了,结果oracle还是不干,反馈错误ORA-30926: 无法在源表中获得一组稳定的行,这个地方balck_dn_new和black_dn出现了多对一的现象也是不允许的啊,为了正确使用MERGE,于是对balck_dn进行了排重工作
Delete From balck_dn_new a
 Where a.Rowid >
       (Select Min(x.Rowid) From balck_dn_new b Where b.a = a.a);

接着用上面的merger的SQL语句,成功处理,目的达到了.

Oracle 10g中MERGE有如下一些改进:
1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
分享到:
评论

相关推荐

    一个命令发起Merge Request项目代码提交合并merge.sh

    程序员私藏的工具轻松实现项目开发一个命令发起Merge Request项目代码提交合并,可以指定代码Code View审核人。 不会用,随时私信作者。 最新git项目开发中一键发起merge request工具,自动识别本地环境,支持...

    详解git merge命令应用的三种情景

    主要介绍了详解git merge命令应用的三种情景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    最新git项目开发中一键发起merge request工具,自动识别本地环境,支持windows、Linux、Mac,包含使用教程和资料.sh

    # 进入到Git管理的项目根目录,执行如下命令发起 merge request 请求,默认请求合并到 test 分支,-a 用来指定审核委派人, # 执行 merge 等同于 merge test,或执行 merge 其他远程分支名,具体用法如下: # merge ...

    pre-commit-make:在提交之前运行 make 命令

    有关的与 make post-merge后运行make post-merge命令使用在提交或推送时从 Node 项目运行不同的命令小字作者:Gleb Bahmutov :copyright: 2014许可证:MIT - 对代码做任何事情,但如果它不起作用,请不要怪我。...

    PDF合并mergePDF.exe

    可执行文件放到要合并的文件夹下,双击即可合并exe所在文件夹下所有pdf文件,合并后的文件名为merged.pdf,保存在当前文件夹下。可以新建bat文件,然后bat中指定此可执行文件位置,双击bat也行。...

    gdal_merge_my.py

    gdal拼接的代码修改版,原有的自带的gdal_merge.py如果输入文件名称加起来的长度太长的话容易导致报错,因为cmd的命令长度有限制,修改后解决这个问题。使用时,源文件最后的参数为一堆的待拼接图像路径,这里使用...

    解析SQL Server 2008中的新语句:MERGE

    根据一个源数据表对另一个数据表进行确定性的插入、更新和删除这样复杂的操作,运用新的MERGE语句,开发者用一条命令就可以完成。对两个表进行信息同步时,有三步操作要进行。首先要处理任何需要插入目标数据表的新...

    mailmerge:该库提供了少数API,可以使用不同的邮件服务发送各种电子邮件

    完成Composer后,运行以下命令,它将迁移mailmerge迁移: php artisan mailmerge:migrate 配置程序包 您可以使用以下方法发布配置文件: php artisan vendor:publish --tag= " mailmerge-con

    grunt-module-merge:通过使用模块声明文件合并文件来创建模块的实验性插件

    熟悉该过程后,您可以使用以下命令安装此插件: npm install grunt-module-merge --save-dev 安装插件后,可以使用以下 JavaScript 代码在 Gruntfile 中启用它: grunt . loadNpmTasks ( 'grunt-module-merge' ) ;...

    bin_merge.bat

    通过Windows批处理命令实现二进制文件合并,便于分析各种用途的二进制文件制作和分析,脚本简单,易于理解,使用灵活,可以提高工作效率

    使用BeyondCompare来merge你的代码

    通过上面的命令可以查看当前系统可以使用的和支持的gitdiff或gitmerge插件,运行结果如图,git提供了对多种比较工具的支持其中bc3即对应BeyondCompare版本3、4依赖macox需要安装bc的命令行工具(在bc菜单中运行...

    git分支操作.txt

    git merge命令示例: $ git merge branchname 这个命令把分支"branchname"合并到了当前分支里面。 如有冲突(冲突--同一个文件在远程分支和本地分支里按不同的方式被修改了);那么命令的执行输出就像下面一样

    grunt-merge-json:Grunt Merge JSON(来自 Ralf S. Engelschall 的镜像)

    熟悉该过程后,您可以使用以下命令安装此插件: npm install grunt-merge-json --save-dev 安装插件后,可以使用以下 JavaScript 代码在 Gruntfile 中启用它: grunt . loadNpmTasks ( 'grunt-merge-json' ) ;任务...

    git命令.pdf

    git命令,git基本命令列表,使用说明: 如检查git版本、设置基本配置、pull、push和merge等。

    grunt-json-merge:Grunt.js插件可合并处理键覆盖的JSON文件

    熟悉该过程后,可以使用以下命令安装此插件: npm install grunt-json-merge --save-dev 插件安装完成后,可以使用以下JavaScript代码在您的Gruntfile中启用该插件: grunt . loadNpmTasks ( 'grunt-json-merge' ...

    Sublime Merge 2.0 Build 2083 Git客户端

    Sublime Merge 是Sublime Text制作者开发的一款Git客户端。...可以保留你的文件和历史记录,命令面板和热键绑定。支持光明与黑暗主题,可扩展性,语法高亮显示,命令行集成,是一个真正的Git客户端。

    merge-deep:递归合并JavaScript对象中的值

    深合并 递归合并javascript对象中的值。 请考虑关注该项目的作者 ,并考虑为该项目以显示您的 :red_heart: 和支持。 安装 ... 您可以使用以下命令安装依赖项并运行测试: $ npm install && npm t

    grunt-labeled-merge

    熟悉该过程后,您可以使用以下命令安装此插件: npm install grunt-labeled-merge --save-dev 安装插件后,可以使用以下 JavaScript 代码在 Gruntfile 中启用它: grunt . loadNpmTasks ( 'grunt-labeled-merge...

    Merge-Grid-List-Angular10:合并角度为10的网格列表

    使用工具栏中的“ Generate按钮生成网格列表 选择按住meta键的相邻单元格(注意:在Macintosh键盘上,此键为命令键(⌘)。在Windows键盘上,此键为Windows键(⊞)。) 启用Merge按钮后,合并选定的单元格不断合并...

Global site tag (gtag.js) - Google Analytics