码农之家 - SQL
type: channel
link: http://www.liyx.fun/index.php/tag/SQL/
items: SQL语句递归查询 sqlserver oracle
items: Oracle 数据库实现数据更新：update、merge
items: ORACLE decode函数

SQL语句递归查询 sqlserver oracle
type: item
date: 2018-12-14T20:56:00+08:00
description: 对于一些自表关联的表，想要查出一条记录和它的所有下属子级，可以用下面的语句：sqlserver: with my1 as(select * from aaa where id = 1 union all select aaa.* from my1, aaa where my1.id = aaa.pid ) select * from my1; 查询出来删除可以这样写： with my1 as(select * from aaa where id = 1 union all select aaa.* from my1, aaa where my1.id = aaa.pid ) delete from aaa where id in (select id from my1); oracle:SELECT id FROM rightTree t START WITH t.id = #{ID} CONNECT BY PRIOR t.id = t.parent_id 查询出来删除可以这样写：delete from rightTree where id in( SELECT id FROM rightTree t START WITH t.id = #{ID} CONNECT BY PRIOR t.id = t.parent_id ) 参考：https://bbs.csdn.net/topics/350041264https://blog.csdn.net/qq_25391785/article/details/79136853

Oracle 数据库实现数据更新：update、merge
type: item
date: 2018-11-29T00:51:00+08:00
description: 工作中遇到的数据更新，学习记录。1、使用update进行数据更新 1）最简单的更新 update tablea a set a.price=1.00 2）带条件的数据更新 update tablea a set a.price = 2.00 where a.id='02' 3）两张表关联更新为固定值 update tablea a set a.price =3.00 where exits(select 1 from tableb b where a.id=b.id) 将a,b相同id的 a表的price 字段更新为 3.00 4）关联更新数据来源第二张表 update tablea a set a.price=(select price from tablec c ) where exits (select 1 from tablec c where a.id=c.id) 将a表price字段 更新为 id和c表id相同的数据 5）关联更新多个字段 update tablea a set ( a.price,a.type)=(select c.price,c.type from tablec c ) where exits (select 1 from tablec c where a.id=c.id) 更新a表的price 和 type 字段 6）使用视图方式更新 update (select a.price old,c.price as new from tablea a ,tablec c where a.id=c.id) set old=new 以上为自己了解到的Update使用方式，需要注意 a.id 和c.id需要一一对应。即c表只有一条id 与a表id对应，否则会报错ORA-01427:"single-row subquery returns more than one row"单行查询返回多行结果。是不能进行更新的。2、merge 更新使用 工作中要对一个字段：次数 进行更新 表数据量在 13w+ 需要两表关联 也就是 两个 13w+ 的表进行关联。 在使用update进行更新的时候，效率问题大大降低。加上限制条件更新 100条数据还用了6-8S，所以 update并不适用。 查阅资料看到merge 更新，便学习记录。 MERGE 在SQL Server、Oracle数据库中可用，MySQL、PostgreSQL中不可用。可以同时进行更新和插入操作。执行效率要高于INSERT+UPDATE。语法： MERGE INTO [your table-name] [rename your table here] USING ( [ your query ] )[rename your query-sql and using just like a table] ON ([conditional expression ] AND [...]...) WHEN MATHED THEN [here you can execute some update sql or something else ] WHEN NOT MATHED THEN [execute something else here ! ]示例merge into tablea a ----要更新或者操作的表 using tablec c ----源表 using (select * from tablec ) c on (a.id=c.id) --匹配条件 when matched then update set a.price=c.price --当匹配时进行更新操作 when not matched then --不匹配进行插入操作 insert values (c.id,c.price) using 后不仅可以使用 表 也可以是 视图或者子查询 using (select * from tablec ) c not matched 可以没有 就是当不匹配什么也不做。 总结： 之前说的使用update更新100行数据都需要6-8S 使用merge 更新全部数据（13W+ 与13W+ 关联）只用了10S左右。更新效率可见要比update高很多。 仅供学习使用。注意： Oracle下使用 merge语句，on 后需要加括号， Navicat + Oracle 11g 无括号会报语句错误。 以上摘自：https://www.cnblogs.com/com-xiaolanchong/p/7684130.html补充：merge into ... delete 写法--删除 t1 表在 t2 表内的记录 merge into test1 t1 using (se…

ORACLE decode函数
type: item
date: 2018-11-29T00:48:16+08:00
description: DECODE是Oracle公司独家提供的功，该函数功能强大，下文对DECODE函数的语法作了详尽的阐述，供您参考学习。含义解释：decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)该函数的含义如下：IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IFdecode(字段或字段的运算，值1，值2，值3） 这个函数运行的结果是，当字段或字段的运算的值等于值1时，该函数返回值2，否则返回值3当然值1，值2，值3也可以是表达式，这个函数使得某些sql语句简单了许多使用方法：1、比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0、正数还是负数，分别返回0、1、-1例如：变量1=10，变量2=20则sign(变量1-变量2)返回-1，decode解码结果为“变量1”，达到了取较小值的目的。2、此函数用在SQL语句中，功能介绍如下：Decode 函数与一系列嵌套的 IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配，就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配，则返回default。每个compare值顺次求值，如果发现一个匹配，则剩下的 compare值（如果还有的话）就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话，每一个compare值都被转换成和第一个compare 值相同的数据类型，这个数据类型也是返回值的类型。Decode函数在实际开发中非常的有用结合Lpad函数，如何使主键的值自动加1并在前面补0select LPAD(decode(count(记录编号),0,1,max(to_number(记录编号)+1)),14,'0') 记录编号 from tetdmiseg:select decode(dir,1,0,1) from a1_intervaldir 的值是1变为0，是0则变为1比如我要查询某班男生和女生的数量分别是多少?通常我们这么写:select count(*) from 表 where 性别 ＝ 男；select count(*) from 表 where 性别 ＝ 女；要想显示到一起还要union一下，太麻烦了用decode呢，只需要一句话select decode(性别，男，1，0），decode(性别，女，1，0） from 表3，order by对字符列进行特定的排序大家还可以在Order by中使用Decode。例：表table_subject，有subject_name列。要求按照：语、数、外的顺序进行排序。这时，就可以非常轻松的使用Decode完成要求了。select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)4、DECODE实现表的转置数据库中的表是由列和行构成的一个二维表。一般列在任何数据库中都是有限的数量，而行的变化较大，如果表很大，行的数量可能大上千万行。同一列的不同行可能有不同的值，而且不是预先定义的。例:住房公积金报表置换实例：1.各个单位在本地经办行进行开户，开户就是将单位的基本信息和职工信息的进行登记；2.每月各个单位的会计到经办行交缴本单位的所有职工的住房公积金，系统记录有每个职工的交缴明细并在每条记录上记录有经办行的代码；3.每月、季、半年及年终都要求将经办行 变为“列”给出个月的明细报表：经办行：城西区 城东区 月份：2001.01 xxxx1.xx xxxxx2.xx 2001.02 xxxx3.xx xxxxx4.xx 。 。 。 。 。 。原来的数据顺序是：城西区2001.01 xxxxx1.xx城东区2001.01 xxxxx2.xx城西区2001.02 xxxxx3.xx城东区2001.02 xxxxx4.xx住房公积金系统记录职工的每月交缴名细的pay_lst表结构是：bank_code varchar2(6)NOT NULL, -- 经办行代码acc_no varchar2(15) not null, -- 单位代码(单位帐号)emp_acc_no varchar2(20) not null, -- 职工帐号tran_date date not null, --…