请问oracle添加列如何设置某列对应另一列的值只能出现一次

查询多个列中任意一列满足条件的数据
[问题点数:40分,结帖人stiff_neck]
本版专家分:0
结帖率 97.83%
CSDN今日推荐
本版专家分:0
本版专家分:0
本版专家分:445
本版专家分:11969
2013年8月 Oracle大版内专家分月排行榜第一2013年7月 Oracle大版内专家分月排行榜第一2013年6月 Oracle大版内专家分月排行榜第一2013年5月 Oracle大版内专家分月排行榜第一
2013年9月 Oracle大版内专家分月排行榜第二
本版专家分:9928
2016年12月 Oracle大版内专家分月排行榜第二2016年11月 Oracle大版内专家分月排行榜第二2016年10月 Oracle大版内专家分月排行榜第二2013年7月 Oracle大版内专家分月排行榜第二
2013年5月 Oracle大版内专家分月排行榜第三
本版专家分:5104
2013年5月 Oracle大版内专家分月排行榜第二
本版专家分:0
本版专家分:0
匿名用户不能发表回复!
其他相关推荐Oracle将一列值按照另一列分组拼接的方法讲解_Oracle教程-织梦者
当前位置:&>&&>& > Oracle将一列值按照另一列分组拼接的方法讲解
Oracle将一列值按照另一列分组拼接的方法讲解
怎么把一列值按照另一列分组拼成字符串。
比如下面两列:
SQL& select deptno,ename from emp wher
14 rows selected.
将ename根据deptno的值拼成字符串。
实现方法一: 用分析函数row_number() over进行分组然后用sys_connect_by_path进行拼接:
select max(sys_connect_by_path(ename, ',')) name,deptno
from (select ename, deptno, row_number() over(partition by deptno order by ename) ro
from (select deptno,ename from emp where deptno is not null)
start with newtab.ro = 1
connect by prior newtab.ro = newtab.ro - 1
,CLARK,KING,MILLER,SCOTT,TURNER,WARD
,CLARK,KING,MILLER,SCOTT,SMITH
,CLARK,KING,MILLER
实现方法二: 更简便,用函数wm_concat(列名),该函数可以把列值以逗号分隔,并显示成一行。
SQL& select DEPTNO,wm_concat(ENAME) n from emp where deptno is not null group by DEPTNO;
---------- --------------------------------------------------
10 CLARK,MILLER,KING
20 SMITH,JAMES,ADAMS,SCOTT,JONES
30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD以上就是Oracle将一列值按照另一列分组拼接的方法讲解的全文介绍,希望对您学习和使用Oracle有所帮助.
这些内容可能对你也有帮助
更多可查看Oracle教程列表页。
猜您也会喜欢这些文章酷勤网 C 程序员的那点事!
浏览次数:次
作者:toworm
我有一表&aa,代表客户的基本编码信息,其中id代表标识,类别代表客户的类别,当类别为1的时候代表是个人客户,为2时代表单位客户ID&&&&类别1&&&&&&&&&&12&&&&&&&&&&23&&&&&&&&&&13&&&&&&&&&&2另一表bb,该表为个人客户表id&&&&&名称1&&&&&&&&&张三2&&&&&&&&&李四3&&&&&&&&&王五还有一表cc&该表为单位客户表id&&&&&名称1&&&&&&&&工行2&&&&&&&&农行3&&&&&&&&建行我想通过一个语句查询出所有客户的id和名称,即我期望的结果集是id&&&&&&&名称1&&&&&&&&张三2&&&&&&&&农行3&&&&&&&&王五3&&&&&&&&建行哪位高手指点一下这个sql怎样写,用decode可以么先谢了
&john_student 回复于: 14:05:00
难题啊,我也想知道,我的是informix,实际中确实有这种情况,sql怎么写呢?
&feijin 回复于: 14:35:38
如果和类别没有关系可以用unionselect&*&from&aunionselect&*&from&b
&toworm 回复于: 15:40:39
我要的就是根据类别列不同的取值关联不同的表啊
&CCBZZP 回复于: 16:24:35
建h用SELECT&...UNIONSELECT&...UNION...
&rollingpig 回复于: 16:41:46
create&view&customer_info_2as&(select&*,1&from&bbunionselect&*,2&from&cc)understand?
&toworm 回复于: 18:10:28
union谁不会啊,那样效率不是很低么我实际应用的表很大的啊decode不行么,oracle上有没有case的用法啊
&seraphim 回复于: 01:48:42
9i以后oracle就支持case了
&huanggzcn 回复于: 01:54:30
select&aa.id,decode(aa.类别,1,bb.名称,cc.名称)from&aa,bb,ccwhere&aa.id=bb.id&and&aa.id=cc.id做一个三表的关联,并把记录数最少的表名放在From子句最右边,再对[aa.类别]进行判别,如果是[1]就取[bb.名称]如果是[2]就取[cc.名称]这样的速度并不慢,肯定比Union快
&ohwww 回复于: 09:21:50
这个问题挺有意思,学习....
&toworm 回复于: 10:20:59
引用:原帖由&"huanggzcn"&发表:这样的速度并不慢,肯定比Union快这样肯定是不行的,请参见我下面的例子[color=red]select&*&from&aa[/color]&&&&&&&&ID&&&&&&&TYPE----------&----------&&&&&&&&&1&&&&&&&&&&1&&&&&&&&&2&&&&&&&&&&1&&&&&&&&&3&&&&&&&&&&2&&&&&&&&&4&&&&&&&&&&24&rows&selected[color=red]select&*&from&bb[/color]&&&&&&&&ID&NAME&&&&&&&&&&&&&&&&----------&--------------------&&&&&&&&&1&张三&&&&&&&&&&&&&&&&&&&&&&&&&2&&李四&&&&&&&&&&&&&&&2&rows&selected[color=red]select&*&from&cc[/color]&&&&&&&&ID&NAME&&&&&&&&&&&&&&&&----------&--------------------&&&&&&&&&3&&工行&&&&&&&&&&&&&&&&&&&&&&&&4&&农行&&&&&&&&&&&&&&&2&rows&selected[color=red]select&aa.id,decode(aa.type,1,bb.name,cc.name)from&aa,bb,ccwhere&aa.id=bb.id&and&aa.id=cc.id[/color]&&&&&&&&ID&DECODE(AA.TYPE,1,BB.NAME,CC.NA----------&------------------------------0&rows&selected[color=red]select&aa.id,decode(aa.type,1,bb.name,cc.name)from&aa,bb,ccwhere&aa.id=bb.id&or&aa.id=cc.id[/color]&&&&&&&&ID&DECODE(AA.TYPE,1,BB.NAME,CC.NA----------&------------------------------&&&&&&&&&3&&工行&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&3&&工行&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4&&农行&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4&&农行&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1&张三&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1&张三&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2&&李四&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2&&李四&&&&&&&&&&&&&&&&&&&&&&&&&8&rows&selected总之不论是用and还是or结果集的数量是不符合实际需求的[color=red]因为我们实际是想要得到&&&&&&&&&1&张三&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2&&李四&&&&&&&&&&3&&工行&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4&&农行如果通过or方式再进行distinct估计比union还要慢,何况例子只是2个表,如果更多的话,结果集会更多&[/color]
&john_student 回复于: 11:11:11
用and条件的改一下:aa与bb,cc分别为外部连接应该就可以的了。具体语法Oracle的不太懂,好像是:from&aa,&bb(+),&cc(+)&????????informix是这样的(兄弟我只会informix):from&aa,&outer&bb,&outer&cc我没有环境测试oracle,哪位测试过后,告诉我结果哦。THANKS&^0^
&huanggzcn 回复于: 14:24:52
我上面的语句没有考虑在表bb,&cc中不存在记录的情况,只需要使用outer&join就可以完成楼主的要求了,具体的sql如下:select&aa.id,&decode(aa.type,&1,&bb.name,&cc.name)&from&aa,&bb,&cc&where&aa.id(+)&=&bb.id&and&aa.id(+)&=&cc.这样效率就不知道怎么样了,个人意见是表连接还是会比使用Union要快些小弟在此抛砖引玉了
&toworm 回复于: 14:31:49
引用:原帖由&"huanggzcn"&发表:我上面的语句没有考虑在表bb,&cc中不存在记录的情况,只需要使用outer&join就可以完成楼主的要求了,具体的sql如下:select&aa.id,&decode(aa.type,&1,&bb.name,&cc.name)&from&aa,&bb,&cc&where&aa.id(+)&=&b..........好像不行啊&&1&&select&aa.id,&decode(aa.type,&1,&bb.name,&cc.name)&&&2&&from&aa,&bb,&cc&&&3&&where&aa.id&(+)=&bb.id&&&4*&and&aa.id&(+)=&cc.id&SQL&;&/and&aa.id&(+)=&cc.id&*[color=red]ERROR&&I&&O&U&&U&4&ÐÐ:&ORA-01417:&a&table&may&be&outer&joined&to&at&most&one&other&table&[/color]
&toworm 回复于: 14:37:08
上面说的可以,是+号写反了&&1&&select&aa.id,&decode(aa.type,&1,&bb.name,&cc.name)&&&2&&from&aa,&bb,&cc&&&3&&where&aa.id=&bb.id&(+)&&&4*&and&aa.id&=&cc.id&(+)&即可
&huanggzcn 回复于: 14:39:59
不好意思,是我写反了,表aa的数据最全,搞错了
&toworm 回复于: 14:44:24
我又试了其他几种情况,好像都没问题,谢了上面那个错误主要还不是表aa数据不全的问题,好像错误提示是同一个表只能外连接一个表,而不能同时有多个
&huanggzcn 回复于: 14:59:26
如果假设表是下面的情况aa------2  aa2bb------1  bb12  bb2cc------2  cc23  cc3如果aa和bb外连接的结果是:     1 bb12 aa2 2 bb2如果aa和cc外连接是2 aa2 2 cc2     3 cc3&&&&&&&&&&&如果是aa.id(+)&=&bb.id&and&aa.id(+)&=&cc.id的话,同时把表aa和两个表外连接的话我还没想出来结果是怎么样的所以我觉得刚才那个错误也是这个道理吧
&voi-jia 回复于: 00:11:00
&ohwww 回复于: 11:05:32
不太明白。不过我想实现如下功能:根据表中某个字段的值的不同而去关联不同的表如表acol1&&col2130&&aa131&&bb133&&cc如果col1的值为133则关联表1,为130和131就关联表2,该怎么写呢??
&tinywind 回复于: 11:22:24
这种写法会比union好嘛?希望楼主能贴出些比较结果。
&feijin 回复于: 13:48:29
呵呵&个人认为表连接效率不如union&看楼主的意思&我的做法出来结果有问题?
&toworm 回复于: 15:30:19
我也不知道到底那种好,只是我的理解是如果实际需求是根据一个字段关联多个表,如果不考虑索引,理论上如果关联n个表,则用union实际要对基表全表扫描n次,而用连接应该是一次就够了。不知哪位大虾能实际做一下分析或测试
&huanggzcn 回复于: 01:17:44
减少访问数据库的次数&当执行每条SQL语句时,&ORACLE在内部执行了许多工作:&解析SQL语句,&估算索引的利用率,&绑定变量,&读数据块等等.&由此可见,&减少访问数据库的次数,&就能实际上减少ORACLE的工作量.&例如,&&&&&以下有三种方法可以检索出雇员号等于的职员.&方法1&(最低效)&&&&&SELECT&EMP_NAME,&SALARY,&GRADE&&&&&FROM&EMP&&&&WHERE&EMP_NO&=&342;&&&&&SELECT&EMP_NAME,&SALARY,&GRADE&&&&&FROM&EMP&&&&WHERE&EMP_NO&=&291;&方法2&(次低效)&&&&&&DECLARE&&&&&&&&CURSOR&C1&(E_NO&NUMBER)&IS&&&&&&&&SELECT&EMP_NAME,&SALARY,&GRADE&&&&&&&&&FROM&EMP&&&&&&&&WHERE&EMP_NO&=&E_NO;&&&&&BEGIN&&&&&&&&OPEN&C1(342);&&&&&&&&&FETCH&C1&INTO&…,&..,&..&;&&&&&&&&&…..&&&&&&&&&OPEN&C1(291);&&&&&&&&FETCH&C1&INTO&…,&..,&..&;&&&&&&&&&&CLOSE&C1;&&&&&&&END;&方法3&(高效)&&&&&SELECT&A.EMP_NAME,&A.SALARY,&A.GRADE,&&&&&&&&&&&&&B.EMP_NAME,&B.SALARY,&B.GRADE&&&&&FROM&EMP&A,&EMP&B&&&&&WHERE&A.EMP_NO&=&342&&&&&AND&&&B.EMP_NO&=&291;&注意:&&&&&在SQL*Plus,&SQL*Forms和Pro*C中重新设置ARRAYSIZE参数,&可以增加每次数据库访问的检索数据量,&建议值为200转自--《ORACLE&SQL性能优化系列》
&toworm 回复于: 09:24:31
还是不知道最终的分析结果
&wind0299 回复于: 09:43:44
&huanggzcn 回复于: 18:13:47
为测试效率的情况,我今天特意做了个实验测试环境为以下[均无使用索引,机器为闲置的测试机]SQL&;&desc&hzh_aa&Name&&&&&&&&&&&&&&&&&&&&&&&&&&&&Null?&&&&Type&-------------------------------&--------&----&ID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NUMBER&TYPE&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NUMBER(38&)SQL&;&desc&hzh_bb&Name&&&&&&&&&&&&&&&&&&&&&&&&&&&&Null?&&&&Type&-------------------------------&--------&----&ID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NUMBER&LB&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&VARCHAR2(2)SQL&;&desc&hzh_cc&Name&&&&&&&&&&&&&&&&&&&&&&&&&&&&Null?&&&&Type&-------------------------------&--------&----&ID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NUMBER&LB&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&VARCHAR2(2)SQL&;&运行以下代码往表中插内容:declare&i&beginfor&i&in&1..100000&loopinsert&into&hzh_aa&values(i,1);insert&into&hzh_aa&values(i,2);end&/declare&i&beginfor&i&in&1..100000&loopinsert&into&hzh_bb&values(i,'OK');insert&into&hzh_cc&values(i,'NO');end&/set&timing&on&&&&&&&&&--打开timingselect&count(*)&from&( select&aa.id,&decode(aa.type,&1,&bb.lb,&cc.lb)& from&hzh_aa&aa,&hzh_bb&bb,&hzh_cc&cc where&aa.id=&bb.id&(+)& and&aa.id&=&cc.id&(+)); &连续三次执行的时间分别为:[7691]&[7681]&[7671]select&count(*)&from&( select&hzh_aa.id,lb& from&hzh_aa,hzh_bb where&hzh_aa.id=hzh_bb.id&and&hzh_aa.type=1 union select&hzh_aa.id,lb from&hzh_aa,hzh_cc where&hzh_aa.id=hzh_cc.id&and&hzh_aa.type=2);连续三次执行的时间分别为:[9193]&[9133]&[9153]这是aa表只有20万条记录时的差距,在实际应用中的数据量是远远大于这个的。
&toworm 回复于: 10:38:23
这两天我总是隐隐觉得有些问题,今天想明白了,只有保证几个表之间的数据完整性的前提下用decode加外连接的方式才可以等同与union方式,否则它们得到的结果集是不同的,请看下面的例子select&*&from&aa&&&&&&&&ID&&&&&&&TYPE----------&----------&&&&&&&&&1&&&&&&&&&&1&&&&&&&&&2&&&&&&&&&&1&&&&&&&&&3&&&&&&&&&&2&&&&&&&&&4&&&&&&&&&&2&&&&&&&&&5&&&&&&&&&&1&[color=red]&&&&&&&&5&&&&&&&&&&2[/color]&&&&&&&&&&&&&&&&&&6&&&&&&&&&&27&rows&selectedselect&*&from&bb&&&&&&&&ID&NAME&&&&&&&&&&&&&&&&----------&--------------------&&&&&&&&&1&张三&&&&&&&&&&&&&&&&&&&&&&&&&2&&李四&&&&&&&&&&&&&&&&&&&&&&&&5&王五&&&&&&&&&&&&&&&&3&rows&selectedselect&*&from&cc&&&&&&&&ID&NAME&&&&&&&&&&&&&&&&----------&--------------------&&&&&&&&&3&&工行&&&&&&&&&&&&&&&&&&&&&&&&4&&农行&&&&&&&&&&&&&&&&&&&&&&&&6&招行&&&&&&&&&&&&&&&&3&rows&selectedselect&aa.id,&decode(aa.type,&1,&bb.name,&cc.name)from&aa,&bb,&ccwhere&aa.id=&bb.id&(+)and&aa.id&=&cc.id&(+)&&&&&&&&ID&DECODE(AA.TYPE,1,BB.NAME,CC.NA----------&------------------------------&&&&&&&&&&&&&1&张三&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2&&李四&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&3&&工行&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&4&&农行&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&5&王五&&&&&&&&&&&&&&&&&&&&&&&&&&&[color=red]&&&&&&&&5&&&&&&&&&&&&&&&&&&[/color]&&&&&&&&&&&&&&&&&&&&&&&&&&&6&招行&&&&&&&&&&&&&&&&&&&&&&&&&&7&rows&selectedselect&aa.id,bb.name&from&aa,bbwhere&aa.id=bb.idand&aa.type=1union&select&aa.id,cc.name&from&aa,ccwhere&aa.id=cc.idand&aa.type=2&&&&&&&&ID&NAME&&&&&&&&&&&&&&&&----------&--------------------&&&&&&&&&1&张三&&&&&&&&&&&&&&&&&&&&&&&&&2&&李四&&&&&&&&&&&&&&&&&&&&&&&&5&王五&&&&&&&&&&&&&&&&&&&&&&&&&3&&工行&&&&&&&&&&&&&&&&&&&&&&&&4&&农行&&&&&&&&&&&&&&&&&&&&&&&&6&招行&&&&&&&&&&&&&&&&6&rows&selected大家可以看一下红色的部分,如果在基表中有这条记录,但在子表中没有的话,用union方式是不会选出这条记录的,而用外连接则选出一条记录为空的记录没,有什么办法让外连接方式也不包含这条记录么
&toworm 回复于: 17:20:12
难道这个问题就这样无疾而终了
&john_student 回复于: 22:35:22
decode那个例子,加入条件即可:and&decode(......)&is&not&null其实union那个例子,如果用外联的话,结果集一样会有红色部分记录的情况,自己思考吧。
&toworm 回复于: 09:16:52
当然,如果用union就不需要用外联了。谢谢,明白了,原来没想到在where子句中还用decode
&gold_coin 回复于: 13:51:31
table_mainid&typetable_aid&value1table_bid&value2select&id,decode&(type,1,(select&value1&from&table_a&where&id=x.id),&2,(select&value2&from&table_b&where&id=x.id)&)from&table_main&x建立索引得当一样很快,而且避免了两个表外连接
&ohwww 回复于: 13:56:55
看来我的问题得单独提出来了
&huanggzcn 回复于: 18:52:07
引用:原帖由&"gold_coin"&发表:table_mainid&typetable_aid&value1table_bid&value2select&id,decode&(type,1,(select&value1&from&table_a&where&id=x.id),&2,(select&value2&from&table_b&where&id=x.id)&)from&table_m..........好办法,这样可以分解大的查询为小查询。
&toworm 回复于: 11:07:07
呵呵,真不错,我试了一下,感觉好像比用外连接快,不过为什么它的结果会跟外联一样呢,我是说像我上面那个例子,它也依然会产生一条空记录
& 相关主题:怎么给oracle某列的每一列赋个值,在新的一列中_百度知道
怎么给oracle某列的每一列赋个值,在新的一列中
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
longrenying
longrenying
采纳数:3253
获赞数:7196
你要达到什么效果啊,好歹给个例子,不然真的不知道你要什么。看你的意思,用case when应该可以搞定的。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。怎么给oracle某列的每一列赋个值,在新的一列中_百度知道
怎么给oracle某列的每一列赋个值,在新的一列中
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
sdhammer123
sdhammer123
采纳数:22
获赞数:116
不知道是不是这个意思update 表名 set 列2=列1+100把第二列的值改成第一列+100
能不能把问题描述得更清楚点
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 oracle增加列 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信