做数据割接遇到点麻烦,请大家指点数据库:oracle10G
模拟数据如下:
--创建表
create table mytestgod(
id int ,
name varchar2(20),
age int,
city varchar2(20),
info varchar2(20)
)--插入数据
insert into mytestgod values(1,'name1',20,'广州','');
insert into mytestgod values(2,'name1',20,'广州','');
insert into mytestgod values(3,'name2',20,'广州','');
insert into mytestgod values(4,'name2',20,'广州','');
insert into mytestgod values(5,'name3',21,'广州','');
insert into mytestgod values(6,'name3',21,'广州','');insert into mytestgod values(7,'name1',20,'上海','');
insert into mytestgod values(8,'name1',20,'上海','');
insert into mytestgod values(9,'name2',20,'上海','');
insert into mytestgod values(10,'name2',20,'上海','');
insert into mytestgod values(11,'name3',21,'上海','');
insert into mytestgod values(12,'name3',21,'上海','');insert into mytestgod values(13,'name1',20,'北京','');
insert into mytestgod values(14,'name1',20,'北京','');
insert into mytestgod values(15,'name2',20,'北京','');
insert into mytestgod values(16,'name2',20,'北京','');
insert into mytestgod values(17,'name3',21,'北京','');
insert into mytestgod values(18,'name3',21,'北京','');我想实现的功能如下:
--name1 +20 && name2 + 20 --> (name3 + 21) ==> name3 + 99 && insert name4 + 88 ----city= city当name + city 的值为 (name1 + 20) &&(name2 + 20)的时候,将原本name和age的值为 name3 + 21
的值update为 name3 + 99 , 并且 insert name 和 age 的值为 name4 + 88 进去,还有一个要求就是name1、name2、name3的这几个值的city是一样的,因为这表是一个纵表,一个先决的条件就是所有的操作都要city是一样的,比如都是广州,或者都是北京。(可以这样说,name3对应的age是 由name1和name2这2个 对应的age值决定的,故当name1和name2的age都是20的时候name3对应的age为一个值,当name1和name2的age不是20的时候name3对应的age为一个值,故我想要用到case when;另外一个值name4也是有name1和name2的age值决定的,但是原本没有name4的值,所以要insert,这里也要用到case when 吧?)不知道表述清楚了没有,请大家指教!
模拟数据如下:
--创建表
create table mytestgod(
id int ,
name varchar2(20),
age int,
city varchar2(20),
info varchar2(20)
)--插入数据
insert into mytestgod values(1,'name1',20,'广州','');
insert into mytestgod values(2,'name1',20,'广州','');
insert into mytestgod values(3,'name2',20,'广州','');
insert into mytestgod values(4,'name2',20,'广州','');
insert into mytestgod values(5,'name3',21,'广州','');
insert into mytestgod values(6,'name3',21,'广州','');insert into mytestgod values(7,'name1',20,'上海','');
insert into mytestgod values(8,'name1',20,'上海','');
insert into mytestgod values(9,'name2',20,'上海','');
insert into mytestgod values(10,'name2',20,'上海','');
insert into mytestgod values(11,'name3',21,'上海','');
insert into mytestgod values(12,'name3',21,'上海','');insert into mytestgod values(13,'name1',20,'北京','');
insert into mytestgod values(14,'name1',20,'北京','');
insert into mytestgod values(15,'name2',20,'北京','');
insert into mytestgod values(16,'name2',20,'北京','');
insert into mytestgod values(17,'name3',21,'北京','');
insert into mytestgod values(18,'name3',21,'北京','');我想实现的功能如下:
--name1 +20 && name2 + 20 --> (name3 + 21) ==> name3 + 99 && insert name4 + 88 ----city= city当name + city 的值为 (name1 + 20) &&(name2 + 20)的时候,将原本name和age的值为 name3 + 21
的值update为 name3 + 99 , 并且 insert name 和 age 的值为 name4 + 88 进去,还有一个要求就是name1、name2、name3的这几个值的city是一样的,因为这表是一个纵表,一个先决的条件就是所有的操作都要city是一样的,比如都是广州,或者都是北京。(可以这样说,name3对应的age是 由name1和name2这2个 对应的age值决定的,故当name1和name2的age都是20的时候name3对应的age为一个值,当name1和name2的age不是20的时候name3对应的age为一个值,故我想要用到case when;另外一个值name4也是有name1和name2的age值决定的,但是原本没有name4的值,所以要insert,这里也要用到case when 吧?)不知道表述清楚了没有,请大家指教!
解决方案 »
- oracle expdp问题? 在线等!!!
- 如何实现历史表的生成
- 求简单SQL一个
- 查询一个时间段内的数据
- 紧急求助:使用C#编写的程序,本地oracle9客户端,访问远程oracle7数据库的问题!
- 哪里可以找到相关的资料?
- 我在win2k下连接redhat linux 9下的数据库(sqlplus可以,oem不成!)
- 有关日期的sql语句
- ORA-12154: TNS:could not resolve the connect identifier specified
- Oracle 存储过程中的临时表数据自动清空
- oracle Maps 新手问题?
- 请问Oracle子表的子表的统计 sql如何写
insert into mytestgod values(1,'name1',20,'广州','');
insert into mytestgod values(2,'name1',20,'广州','');
insert into mytestgod values(3,'name2',20,'广州','');
insert into mytestgod values(4,'name2',20,'广州','');
insert into mytestgod values(5,'name3',21,'广州','');
insert into mytestgod values(6,'name3',21,'广州',''); 拿这组数据举例,在处理的时候怎么才能知道是row 1 + row3推出row5,而不是row2+row3推出row5
又或者这其中有一条数据是这样的又该如何处理?
insert into mytestgod values(19,'name1',21,'广州','');
这个生成的的结果有一个业务规则的,所以我才强调需要case when 来转换,
比如update table set age=(case when colA='A' then 'valueA' when colB='B' then 'valueB' else end)
update table set age = (select case when ...)
是的,但是因为name4是新加的字段,原本没有,故要insert进去
...name4是新加的字段,所以才要用update吧
楼主可以增加一列,然后根据主键修改新增列的值
为什么要列转行来insert,再转回去
要得创建删除2次表..
好像有点明白了,楼主说的不是字段,是记录?
就是新增一条name为name4的记录进去对吗?
要求看不明白
楼主是否能贴出这个例子中你想要的结果
对照一下也许更容易理解
name4是一个新增的记录,name3和name4都是根据name1和name2的值决定,不同的是name3已经有值,直接update就行,但是name4没有任何记录,需要update,至于你说的
要列转行来insert,再转回去
要得创建删除2次表..
这个的确是存在的,周末有事出外,回来继续想想有没更好的解决方案
你也可以将具体的情况说说
主要是上面关于如何update和insert的规则的描述我看不明白
select id,name,value,productId from
(select a_b from tbl_a where a_b in
(select a_b from tbl_b where condition) )
where conditiontbl_a,tbl_b 通过 字段 a_b 可以查出 字段 productId,然后用字段productId在tbl_c 表 查处的数据如下:
id name value productId
1 name1 value1 a
2 name2 value2 a
3 name3 value3 a
4 name1 value1 b
5 name2 value2 b
6 name3 value3 b
7 name1 value1 c
8 name2 value2 c
9 name3 value3 c
10 name1 value1 d
11 name2 value2 d
12 name3 value3 d想要的结果如下:
id name value productId
1 name1 value1 a
2 name2 value2 a
3 name3 value3 a
name4 value4 a
4 name1 value1 b
5 name2 value2 b
6 name3 value3 b
name4 value4 a
7 name1 value1 c
8 name2 value2 c
9 name3 value3 c
name4 value4 a
10 name1 value1 d
11 name2 value2 d
12 name3 value3 d
name4 value4 aname3 和name4的值是由 name1 和 name2的值通过业务逻辑决定的,
name3的值是原有的,因为现在改变的方案,所以要通过name1 和 name2的值重新生成name3的值,这个要update;name4是附加的值,原来没有的,现在要insert一个记录进去
三个表tbl_a,tbl_b,tbl_c
select id,name,value,productId from
(select a_b from tbl_a where a_b in
(select a_b from tbl_b where condition) )
where conditiontbl_a,tbl_b 通过 字段 a_b 可以查出 字段 productId,然后用字段productId在tbl_c 表 查处的数据如下:
id name value productId
1 name1 value1 a
2 name2 value2 a
3 name3 value3 a4 name1 value1 b
5 name2 value2 b
6 name3 value3 b7 name1 value1 c
8 name2 value2 c
9 name3 value3 c10 name1 value1 d
11 name2 value2 d
12 name3 value3 d想要的结果如下:
id name value productId
1 name1 value1 a
2 name2 value2 a
3 name3value3 a
name4 value4 a
4 name1 value1 b
5 name2 value2 b
6 name3value3 b
name4 value4 b
7 name1 value1 c
8 name2 value2 c
9 name3value3 c
name4 value4 c
10 name1 value1 d
11 name2 value2 d
12 name3value3 d
name4 value4 dname3 和name4的值是由 name1 和 name2的值通过业务逻辑决定的,
name3的值是原有的,因为现在改变的方案,所以要通过name1 和 name2的值重新生成name3的值,这个要update;name4是附加的值,原来没有的,现在要insert一个记录进去
[/Quote]
select id,name,value,productId from
(select a_b from tbl_a where a_b in
(select a_b from tbl_b where condition) )
where conditiontbl_a,tbl_b 通过 字段 a_b 可以查出 字段 productId,然后用字段productId在tbl_c 表 查处的数据如下:
id name value productId
1 name1 value1 a
2 name2 value2 a
3 name3 value3 a4 name1 value1 b
5 name2 value2 b
6 name3 value3 b7 name1 value1 c
8 name2 value2 c
9 name3 value3 c10 name1 value1 d
11 name2 value2 d
12 name3 value3 d想要的结果如下:
id name value productId
1 name1 value1 a
2 name2 value2 a
3 name3 value3 a
name4 value4 a4 name1 value1 b
5 name2 value2 b
6 name3 value3 b
name4 value4 b7 name1 value1 c
8 name2 value2 c
9 name3 value3 c
name4 value4 c10 name1 value1 d
11 name2 value2 d
12 name3 value3 d
name4 value4 dname3 和name4的值是由 name1 和 name2的值通过业务逻辑决定的,
name3的值是原有的,因为现在改变的方案,所以要通过name1 和 name2的值重新生成name3的值,这个要update;name4是附加的值,原来没有的,现在要insert一个记录进去
把这个关联结果当原表的话
update tt set value=(子查询) where name='name3' and ...;
insert into tt(name,value,productid) (select .......)--这个关键在里面的那个子查询怎么写
还有要实现的结果
现在这样代码没法写..
update这个,假设如果name1和name2的value相等的时候update
update tt t1 set value=YOURVALUE
where name='name3' and exists(
select 1 from (select * from tt where name='name1')a,
(select * from tt where name='name2')b
where a.value=b.value
and a.productid=t1.productid)
where name='name3' and exists(
select 1 from (select * from tt where name='name1')a,
(select * from tt where name='name2')b
where a.value=b.value
and a.productid=b.productid
and a.productid=t1.productid)
规则如下:
name1 name2 name3 name4
1 level1 vip1 100%
1 level2 vip2 90%
1 level3 vip3 80%
1 level4 vip4 70%
1 level5 vip5 60%
1 level6 vip6 50%
1 level7 vip7 40%
1 level8 vip8 30%2 level3 vip21 90%
2 level4 vip22 75%
2 level5 vip23 60%
2 level6 vip24 45%
2 level7 vip25 30%
2 level8 vip26 15%3 level6 vip31 80%
3 level7 vip32 60%
3 level8 vip33 40%当name1=1 and name2=level1 ===> name3=vip1 , name4=100%;
name1=1 and name2=level2 ===> name3=vip2 , name4=90%;
name1=1 and name2=level3 ===> name3=vip3 , name4=80%;
.
.
.
name1=3 and name2=level7 ===> name3=vip32 , name4=60%;
name1=3 and name2=level8 ===> name3=vip33 , name4=40%;
name2 的value 只是level1,level2,level3,level4,level5,level6,level7,level8这8个,
name3和name4的value就是有name1 and name2 的值决定,一共有8+6+3=17种可能
用update一条就可以搞定,不过case when 要写上所有的情况
update tt set name3=
case when name1=1 and name2='level1' then 'vip1'
when name1=1 and name2='level2' then 'vip2'
when name1=1 and name2='level3' then 'vip3'
..............
end,
name4=
case when name1=1 and name1='level1' then '100%'
..................
end;
如果有规律的话,也许能简化一些
这个例子我找不到规律
我不明白name1=3,name2='level8'的时候,name3为什么不是vip24而是vip33
name4结果是怎么确定的,似乎不只是和name2有关
按业务逻辑实现的,是没有规律的,
其实name2的取值范围是由name1决定的,当name1是1 的时候,name2是1-8;
当name1是2的时候name2是3-8;
当name1是3的时候name2是6-8;
只不过在这里之前我做了处理所以就忽略了这部;
name4是没有记录的,由 name1 + name2的值共同实现的;要insert进去
update的还容易实现,insert的就比较麻烦;
case when的时候 用注意name1,name2,name3,name4所有的操作都必须是productId是相等的,
这点保证我有点控制不好
现在就2个难点:
1. set name3=
case when name1=1 and name2='level1' then 'vip1' 的时候
怎样保证name3 的 productId和name1、name2的productId是一样的?2.name4是要insert进去的,同样也要保证productId是一样的,
在insert 中用 case when 不好控制(我自己不熟这个)
你说的难点
1:如果你的表结构是像22楼那样的,那么同一条记录上没有这个问题。如果那个表是几个表连接后的视图,连接条件加上productId相等这条就行。如果表结构不是这样,而是你在顶楼写的那样,那么还不能这么简单update2:如果是22楼的表结构,就是先增加name4这个字段,这是name4字段存在,但是值为空,要update不是insert。如果是顶楼的结构,那么
insert into tt(...)
select 'name4',case when ....end as value,...
from (select )--子查询里将相同productid的记录合并到一条