求一替代料算法

rainxies 2012-11-22 01:28:24
table如下,org_item表示“原物料”,new_item表示“新物料”。
即原物料可以用新物料替代,同样,新物料也可以替代原物料
create table t(
org_item varchar(10),
new_item varchar(10)
);
insert into t values('a','d');
insert into t values('b','c');
insert into t values('b','d');
insert into t values('x','y');


希望得到如下结果:
料号 群组号
a 1
b 1
c 1
d 1
x 2
y 2

即:a、b、c、d是一组料号,它们相互可以替代;x、y是一组料号

请教各位童鞋,该如何写SQL,procedure也可

谢谢!
...全文
204 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainxies 2012-11-22
  • 打赏
  • 举报
回复
看来还是求人不如求己啊
declare
  v_group_id        number;
  v_org_item        number;
  v_new_item        number;
  v_insert_group_id number;
  v_insert_item_id  number;
begin
  delete t2;
  delete t_result;
  insert into t2
    select org_item, new_item, rownum from t;
  loop
    if v_group_id is not null then
      select max(group_id), max(new_item)
        into v_insert_group_id, v_insert_item_id
        from (select a.group_id, new_item
                from t2 a, t_result b, t_result c
               where a.org_item = b.item
                 and a.new_item = c.item(+)
                 and b.group_id = v_group_id
                 and c.item is null
              union
              select a.group_id, org_item
                from t2 a, t_result b, t_result c
               where a.new_item = b.item
                 and a.org_item = c.item(+)
                 and b.group_id = v_group_id
                 and c.item is null) a
       where rownum = 1;
      insert into t_result
        select v_insert_item_id, v_group_id
          from dual
         where v_insert_item_id is not null;
      delete t2 where group_id = v_insert_group_id;
    end if;
    if v_group_id is null or sql%rowcount < 1 then
      select max(group_id), max(org_item), max(new_item)
        into v_group_id, v_org_item, v_new_item
        from t2
       where rownum = 1;
      if v_group_id is not null then
        delete t2 where group_id = v_group_id;
        insert into t_result values (v_org_item, v_group_id);
        insert into t_result values (v_new_item, v_group_id);
      end if;
    end if;
    exit when v_group_id is null;
  end loop;
end;
rainxies 2012-11-22
  • 打赏
  • 举报
回复
看不到回复,唉

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧