首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 一道面试题,求解
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 08:14:21 楼主
    一个表tb1,有如下字段:
    出发地    目的地
    a          b
    a          c
    a          d
    b          c
    c          e
    d          f
    e          g
    g          a
    f          h
    问从出发地a可以到达的所有目的地,包括间接到达的,比如包括目的地e,用sql或程式实现均可,请高手赐教
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 08:55:081楼 得分:0
    这个用存储过程实现方便些
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 10:56:402楼 得分:0
    能写出具体的程式吗?
    我写不出来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 11:40:593楼 得分:0
    一个树形结构的sql
    connect by
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 11:51:154楼 得分:0
    引用 3 楼 rexyudl 的回复:
    一个树形结构的sql
    connect by

    看楼主的数据里可能会有循环
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 12:07:595楼 得分:0
    SQL code
    SQL> select c1,c2 from pp_test; C1 C2 -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- a d a c a b b c c e d f e g f h 8 rows selected SQL> SQL> select sys_connect_by_path(c1, '-') 2 from pp_test 3 start with c1 = 'a' connect by prior c2 = c1; SYS_CONNECT_BY_PATH(C1,'-') -------------------------------------------------------------------------------- -a -a -a-c -a-c-e -a -a-b -a-b-c -a-b-c-e 8 rows selected SQL>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 12:37:576楼 得分:0
    关键是start with 出发地 = 'a' connect by prior 目的地 = 出发点;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 13:17:237楼 得分:0
    引用 5 楼 zhpsam109 的回复:
    SQL code

    SQL> select c1,c2 from pp_test;

    C1                                                                            C2
    -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
    a                                                                              d
    a                    …



    得到的并不是我想要的结果,我所要的结果是从a出发可到达的所有目的地,所以可以到达的目的地有:a,b,c,d,e,f,g,h 可能各位误解我的意思了,a 间接可以到达的目的地也要包括,如e,f,g,h
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 13:19:568楼 得分:0
    引用 4 楼 hebo2005 的回复:
    引用 3 楼 rexyudl 的回复:
    一个树形结构的sql 
    connect by

    看楼主的数据里可能会有循环


    我觉得也应该用循环,可是不知道该从哪里下手,怎样确定循环条件,哪个高手能否帮忙写一下。先谢谢各位了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 13:42:419楼 得分:0
    关注!

    5楼的答案牛!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 14:19:2610楼 得分:0
    你这个数据里有一个循环调用,即a->c->e->g->a,这样好象不行吧?
    5楼的答案很好啊,如果在前面再加一个distinct就完美了,呵呵:)
    select distinct sys_connect_by_path(c1, '-')
    from pp_test
    start with c1 = 'a' connect by prior c2 = c1;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 14:38:4311楼 得分:0
    五楼的答案并不符合题目的要求啊,各位好像并没有测试或者看清题意吧,我要的是从出发地a,出发可以到达的所有的目的地,包括间接的,答案应该是a,b,c,d,e,f,g,h,以上目的地从a出发均可到达,所以五楼的想法虽然好,但是并不符合题目的要求
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 15:14:3712楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 15:20:0813楼 得分:0
    如果是程序,估计要用递归
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gaohaha
    • 等级:
    发表于:2008-05-12 15:43:0614楼 得分:0
    SQL code
    create or replace function ffindmd(c_cf varchar2) return varchar2 is type tb1_cursor_type is ref cursor; tb1_cursor tb1_cursor_type; amount int:=0; v_cf tb1.cf%type; res varchar2(500); v_temp tb1.cf%type; begin select count(*) into amount from tb1 where cf=c_cf and md<>'a'; if amount=0 then return ''; else open tb1_cursor for select md from tb1 where cf=c_cf and md<>'a'; dbms_output.put_line('出发点:'||c_cf); loop fetch tb1_cursor into v_cf; exit when tb1_cursor%notfound; dbms_output.put_line(c_cf||'的目的:'||v_cf); --res:=res||' , '||v_cf; v_temp:=ffindmd(v_cf); res:=res||v_temp||v_cf; --dbms_output.put_line(res); end loop; close tb1_cursor; --dbms_output.put_line(res); return res; end if; end ffindmd; select ffindmd('a') from dual ;

    结果我没有去掉重复的..重复的用字符串处理下就是了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 15:49:0915楼 得分:0
    SQL code
    SQL> select distinct 'a' || sys_connect_by_path(p2, '-') from PP_TEXT start with p1 = 'a' connect by prior p2 = p1; 'A'||SYS_CONNECT_BY_PATH(P2,'-') -------------------------------------------------------------------------------- a-b a-b-c a-b-c-e a-b-c-e-g a-c a-c-e a-c-e-g a-d a-d-f a-d-f-h 10行が選択されました。

    在5楼的基础上做的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 15:55:3316楼 得分:0
    select
    distinct substr(path,length(path),1)
    from
    (
    select distinct sys_connect_by_path(trim(c1), '-') path from pp_test start with c1 = 'a' connect by prior c2 = c1
    );
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 15:57:2517楼 得分:0
    如果用的是10G
    需要先
    delete from pp_test
    where c2 = 'a';
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 15:59:0418楼 得分:0
    引用 5 楼 zhpsam109 的回复:
    SQL code

    SQL> select c1,c2 from pp_test;

    C1                                                                            C2
    -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
    a                                                                              d
    a                    …

    元数据有一条是:g          a
    这样就是死循环了,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 16:08:2119楼 得分:0
    select distinct t.b
    from (select a,b from testroad where b!='a') t
    start with t.a = 'a'  connect by prior t.b = t.a
    ;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 16:38:5020楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 17:48:2321楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-14 18:53:3422楼 得分:0
    up
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved