已知表route,字段和内容如下:
起始节点
终止节点
距离
a |
b |
100 |
a |
c |
150 |
a |
d |
200 |
b |
e |
300 |
b |
f |
800 |
e |
g |
100 |
要求写sql或者一段代码,找出从节点a开始能到达的所有终点节点(包括间接到达).
1.创建表route,插入数据
CREATE TABLE route (
begin_node VARCHAR2(3),
end_node VARCHAR2(3),
distance NUMBER(4));
INSERT INTO route VALUES('a','b',100);
INSERT INTO route VALUES('a','c',150);
INSERT INTO route VALUES('a','d',200);
INSERT INTO route VALUES('b','e',300);
INSERT INTO route VALUES('b','f',800);
INSERT INTO route VALUES('e','b',100);
2.创建字符串数组类型
CREATE OR REPLACE TYPE t_string_array IS TABLE OF VARCHAR2(10);
3.创建函数,在字符串数组中查找指定的字符串
CREATE OR REPLACE FUNCTION FindInStringArray(src t_string_array, dest VARCHAR2)
RETURN BOOLEAN
IS
i NUMBER(4);
BEGIN
FOR i in 1..src.COUNT LOOP
IF src(i)=dest THEN
RETURN TRUE;
END IF;
END LOOP;
RETURN FALSE;
END;
4.PL/SQL
DECLARE
v_begin_node VARCHAR2(3);
v_end_node VARCHAR2(3);
CURSOR c_route IS SELECT end_node FROM route WHERE begin_node=v_begin_node;
--已经搜索到的途经的节点集合
searchedNodes t_string_array := t_string_array('a');
--节点集合中将要处理的位置
index0 NUMBER(5) := 1;
BEGIN
--遍历途经的每一个点
WHILE index0 <= searchedNodes.COUNT LOOP
--当前要处理的节点
v_begin_node := searchedNodes(index0);
--当前节点可直接通往的节点
OPEN c_route;
LOOP
FETCH c_route INTO v_end_node;
EXIT WHEN c_route%NOTFOUND;
IF NOT FindInStringArray(searchedNodes, v_end_node) THEN
--这是一个未在集合中出现过的新节点,增加到集合
searchedNodes.EXTEND(1);
searchedNodes(searchedNodes.COUNT) := v_end_node;
--输出
DBMS_OUTPUT.PUT_LINE(v_end_node);
END IF;
END LOOP;
CLOSE c_route;
--集合中的下一元素
index0:=index0 + 1;
END LOOP;
END;
5.如果数据间引用不存在环路,还可以用递归查询来完成
SELECT end_node FROM route
CONNECT BY begin_node=PRIOR end_node
START WITH begin_node='a'
6.如果要打印出从a开始的遍历路径,该怎么办呢?
PL/SQL
的递归调用
分享到:
相关推荐
清华同方开发的面试题 (有兴趣的看一下了 !).doc 缺陷的等级划分,一个经常被问到的问题.doc 软件测试工程师笔试试题(大集合).doc 软件测试工程师测试试题大集合(二)包括答案.doc 软件测试工程师试题发布版.doc...
清华同方开发的面试题 (有兴趣的看一下了 !) 中软的面试题(转贴).doc 亚控科技比试题.doc 神州泰岳测试试题(笔试)转贴.doc 一家通讯公司的面试题目.doc 软件测试工程师试题发布版.doc 某公司的面试...
最新版Java面试宝典,精心提炼核心重点内容简化应用面试实战10秒一道,Java初级,高级,框架,底层原理,数据库,操作系统,微服务,IO,并发,JVM,容器,SpringBoot,SpringCloud,linx,面向对象,常用类,多线程,...
有这样一道面试题: 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布? 答: 把这个文件放在/res/raw目录下即可。res\raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件,会生成资源id。 那么...
面试过程中面试官会做详细记录,二面关于编译和最后一道算法题(解题思路:深度优先遍 历/广度优先遍历),我答的并不好,所以三面面试官问了一些关于编译和深度优先遍历/广 度优先遍历的题目。
文章开头先给大家出一道面试题:在设计某小型项目的数据库(假设用的是MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开发时需要...
2、长按下面图片,关注「松宝写代码」公众号:研发知识体系构建,精选文章,技术分享,项目实战,实验室,每日一道面试题,进阶学习,内推字节跳动各个部门各个岗位,带你一起学习新技术,总结学习过程,让你进阶到...
python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看...11 强插一道面试题 12 Model连表操作梳理 13 多对多自关联 14 Model操作补充 15 再插两道JavaScript面试题 16 Model操作之select_related以及...
文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开发时...
2、实战2020大厂算法面试题:解析大厂算法面试题,分析其中算法原理,并动手实操,让大家通关面试最后一道题。 3、全面、系统化的课程设计:系统化讲解数据结构与算法,让你快速梳理整个算法知识体系,掌握算法的...