mysql 在不同的数据库间查询语句_有关数据库SQL递归查询在不同数据库中的实现方法...
本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。
比如表结构数据如下:
Table:Tree
ID Name ParentId
1 一级 0
2 二级 1
3 三级 2
4 四级 3
SQL SERVER 2005查询方法:
//上查
with tmpTree
as
(
select * from Tree where Id=2
union all
select p.* from tmpTree inner join Tree p on p.Id=tmpTree.ParentId
)
select * from tmpTree
//下查
with tmpTree
as
(
select * from Tree where Id=2
union all
select s.* from tmpTree inner join Tree s on s.ParentId=tmpTree.Id
)
select * from tmpTree
SQL SERVER 2008及以后版本,还可用如下方法:
增加一列TID,类型设为:hierarchyid(这个是CLR类型,表示层级),且取消ParentId字段,变成如下:(表名为:Tree2)
TId Id Name
0x 1 一级
0x58 2 二级
0x5B40 3 三级
0x5B5E 4 四级
查询方法:
SELECT *,TId.GetLevel() as [level] FROM Tree2 --获取所有层级
DECLARE @ParentTree hierarchyid
SELECT @ParentTree=TId FROM Tree2 WHERE Id=2
SELECT *,TId.GetLevel()AS [level] FROM Tree2 WHERE TId.IsDescendantOf(@ParentTree)=1 --获取指定的节点所有下级
DECLARE @ChildTree hierarchyid
SELECT @ChildTree=TId FROM Tree2 WHERE Id=3
SELECT *,TId.GetLevel()AS [level] FROM Tree2 WHERE @ChildTree.IsDescendantOf(TId)=1 --获取指定的节点所有上级
ORACLE中的查询方法:
SELECT *
FROM Tree
START WITH Id=2
CONNECT BY PRIOR ID=ParentId --下查
SELECT *
FROM Tree
START WITH Id=2
CONNECT BY ID= PRIOR ParentId --上查
MYSQL 中的查询方法:
//定义一个依据ID查询所有父ID为这个指定的ID的字符串列表,以逗号分隔
CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(5000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
IF direction=1 THEN
SET sTempChd =cast(rootId as CHAR);
ELSEIF direction=2 THEN
SELECT cast(ParentId as CHAR) into sTempChd FROM Tree WHERE Id=rootId;
END IF;
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM Tree where (direction=1 and FIND_IN_SET(ParentId,sTempChd)>0)
or (direction=2 and FIND_IN_SET(Id,sTempChd)>0);
END WHILE;
RETURN sTemp;
END
//查询方法:
select * from tree where find_in_set(id,getChildLst(1,1));--下查
select * from tree where find_in_set(id,getChildLst(1,2));--上查
补充说明:上面这个方法在下查是没有问题,但在上查时会出现问题,原因在于我的逻辑写错了,存在死循环,现已修正,新的方法如下:
CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(5000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR);
IF direction=1 THEN
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM Tree where FIND_IN_SET(ParentId,sTempChd)>0;
END WHILE;
ELSEIF direction=2 THEN
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(ParentId) INTO sTempChd FROM Tree where FIND_IN_SET(Id,sTempChd)>0;
END WHILE;
END IF;
RETURN sTemp;
END
这样递归查询就很方便了。
mysql 在不同的数据库间查询语句_有关数据库SQL递归查询在不同数据库中的实现方法...相关推荐
- oracle function 写查询语句_五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?...
作者 | 董旭阳TonyDong,CSDN 博客专家 责编 | 唐小引 头图 | CSDN 下载自东方 IC 出品 | CSDN 博客 下面是 5 个关于索引和 SQL 查询性能的测试题:其中 4 个 ...
- excel mysql 参数查询语句_如何用SQL语句查询Excel数据?
如何用SQL语句查询Excel数据? Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT*FROMO ...
- excel mysql 参数查询语句_如何用SQL语句查询Excel数据
Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT * FROM OpenDataSource( ' ...
- Mysql数据库check约束语句_怎么用sql命令语句写check约束
展开全部 用sql命令语句写CHECK约束32313133353236313431303231363533e59b9ee7ad9431333433623137的格式为CHECK (约束条件). 如: ...
- mysql 数据库里查询语句中不等于的两种写法
mysql 数据库里查询语句中不等于的两种写法 ps:本人亲测,阿里云2核4G5M的服务器性价比很高,新用户一块多一天,老用户三块多一天,最高可以买三年,感兴趣的可以戳一下:阿里云折扣服务器 1.my ...
- MySQL精讲(一) |DQL数据查询语句全解析
MySQL精讲系列文章(更新完毕) <MySQL入门必看知识> <MySQL精讲(一) | DQL数据查询语句全解析> <MySQL精讲(二) | DML数据操作语句全解 ...
- mysql pool返回值_【Mysql】你知道一条查询语句是如何执行的吗?
[Mysql]你知道一条查询语句是如何执行的吗?mp.weixin.qq.com 前言 在默认大家学习了Mysql结构的基础上,我们来深入的解析一下sql语句在mysql中是如何流转和实现的.本文会 ...
- Oracle数据库数据查询语句示例(包含大部分常用语句)
Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...
- mysql空值判断怎么优化_MySQL查询语句优化的十个小技巧!
前言 查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.尽量避免在 w ...
最新文章
- java版电子商务spring cloud分布式微服务b2b2c社交电商 (十四)服务注册(consul)
- 解决网络故障的一般方法
- C#中的平台调用(P/Invoke)
- 关于微信小程序下拉出现三个小点
- 四款新旗舰即将发布:小米10和iPhone9领跑,价格惊喜
- 计算机个人培训终结,计算机一级培训个人工作总结
- 使用fseek()函数随机访问文件
- 调试记录:基于NCN5120芯片的KNX-485桥接模块
- POI导出Excel时 设置单元格类型为 数值类型 或者文本类型
- notempty注解属于哪个依赖_@NotEmpty、@NotNull、@NotBlank注解解析
- 计算机外联管理办法,外联部管理制度
- 基于FPGA的正弦信号发生器设计
- 开发届这些公司的自白
- framemaker 换行
- 程序设计思维与实践 Month3 模拟
- 立创商城pcb封装导入
- 接口自动化思路_JAVA
- 超详细讲解代理服务器的使用方法(多图)
- Task01c:随机抽样与卡方检验的SQL实现
- 这15年专业之外的吐血学习总结。