做数据割接遇到点麻烦,请大家指点数据库: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 吧?)不知道表述清楚了没有,请大家指教!

解决方案 »

  1.   

    不是很清楚,
    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,'广州',''); 
      

  2.   


    这个生成的的结果有一个业务规则的,所以我才强调需要case when 来转换,
    比如update table set age=(case when colA='A' then 'valueA' when colB='B' then 'valueB' else end)
      

  3.   

    这个需求是要同时更新name3和name4吧,
    update table set age = (select case when ...)
      

  4.   


    是的,但是因为name4是新加的字段,原本没有,故要insert进去
      

  5.   


    ...name4是新加的字段,所以才要用update吧
      

  6.   

    insert恐怕不行的,因为这些记录已经存在于表中我想是不是先在数据库alter table add column这样把name4加上去,然后统一用update
      

  7.   

    想了下,先把这个纵表改为横表,用一个存储过程,分别update和insert应该就可以了
      

  8.   

    糊涂了..明明有个主键
    楼主可以增加一列,然后根据主键修改新增列的值
    为什么要列转行来insert,再转回去
    要得创建删除2次表..
      

  9.   


    好像有点明白了,楼主说的不是字段,是记录?
    就是新增一条name为name4的记录进去对吗?
    要求看不明白
    楼主是否能贴出这个例子中你想要的结果
    对照一下也许更容易理解
      

  10.   


    name4是一个新增的记录,name3和name4都是根据name1和name2的值决定,不同的是name3已经有值,直接update就行,但是name4没有任何记录,需要update,至于你说的
    要列转行来insert,再转回去 
    要得创建删除2次表..

    这个的确是存在的,周末有事出外,回来继续想想有没更好的解决方案
      

  11.   


    你也可以将具体的情况说说
    主要是上面关于如何update和insert的规则的描述我看不明白
      

  12.   

    三个表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 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一个记录进去
      

  13.   

    [/Quote]
    三个表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]
      

  14.   

    这里不给编辑,为了表达清晰点多发了2次。见谅三个表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 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一个记录进去
      

  15.   

    三表如何关联暂且不管
    把这个关联结果当原表的话
    update tt set value=(子查询) where name='name3' and ...;
    insert into tt(name,value,productid) (select .......)--这个关键在里面的那个子查询怎么写
      

  16.   

    这里面的这个子查询必须把name1和name2决定name3的值考虑到,而且必须name1和name2及name3的productId相等insert的这个暂时也没什么想法
      

  17.   

    那你想好了给个简化版的实际例子,加上具体规则
    还有要实现的结果
    现在这样代码没法写..
    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)
      

  18.   

    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=b.productid
          and a.productid=t1.productid)
      

  19.   


    规则如下:
    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%;
      

  20.   

    name1 的value 只是 1,2,3这三个,
    name2 的value 只是level1,level2,level3,level4,level5,level6,level7,level8这8个,
    name3和name4的value就是有name1 and name2 的值决定,一共有8+6+3=17种可能
      

  21.   

    不是3*8=24种吗
    用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有关
      

  22.   

    上面的vip33等这些数字是我随便写的,
    按业务逻辑实现的,是没有规律的,
    其实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是相等的
    这点保证我有点控制不好
      

  23.   

    简化可以暂时不用考虑了,因为这是业务逻辑,已经定了,一共8+6+3 = 17 种方案;
    现在就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 不好控制(我自己不熟这个)
      

  24.   

    不知道你的表是横的还是纵的,有点晕..
    你说的难点
    1:如果你的表结构是像22楼那样的,那么同一条记录上没有这个问题。如果那个表是几个表连接后的视图,连接条件加上productId相等这条就行。如果表结构不是这样,而是你在顶楼写的那样,那么还不能这么简单update2:如果是22楼的表结构,就是先增加name4这个字段,这是name4字段存在,但是值为空,要update不是insert。如果是顶楼的结构,那么
    insert into tt(...)
    select 'name4',case when ....end as value,...
    from (select )--子查询里将相同productid的记录合并到一条
      

  25.   

    感谢 wildwave 的全程支持,问题基本解决,十分感谢!!!