递归分两种:一种由父项向下级递归,另一种是由子项向上级递归。下面就这两种情况做个简单的处理。

假设有一个表treeview,包含字段 id,parentid,text 分别代表id,上级id,描述字段(这里就不把建表sql写出来了)。

一、Sqlserver中的写法

1、由父项递归下级

with cte(id,parentid,text)
as
(--父项
select id,parentid,text from treeview where parentid = 450 --需替换成自己希望查询的id
union all
--递归结果集中的下级
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.parentid = c.id
)
select id,parentid,text from cte

2、由子级递归父项

with cte(id,parentid,text)
as
(--下级父项
select id,parentid,text from treeview where id = 450 --需替换成自己希望查询的id
union all
--递归结果集中的父项
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.id = c.parentid
)
select id,parentid,text from cte

二、Oracle中的写法

 1、由父项递归下级

select a.id,a.parentid,a.text
from treeview a
start with a.id=450 --需替换成自己希望查询的id
connect by prior a.id = a.parentid

 2、由子级递归父项

select a.id,a.parentid,a.text
from treeview a
start with a.id=450 --需替换成自己希望查询的id
connect by prior a.parentid = a.id

三、PostgreSQL中的写法

1、由父项递归下级

with RECURSIVE cte (id,parentid,text)
as
(
select id,parentid,text from treeview where id = 10 --需替换成自己希望查询的id
union all
select t.id,t.parentid,t.text from treeview t,cte t1 where t1.id=t.parentid
)
select * from cte order by rpad(id::varchar,5,'0') asc;

 2、由子级递归父项

with RECURSIVE cte (id,parentid,text)
as
(
select id,parentid,text from treeview where id = 111 --需替换成自己希望查询的id
union all
select t.id,t.parentid,t.text from treeview t,cte t1 where t1.parentid=t.id
)
select * from cte order by rpad(id::varchar,5,'0') asc;

四、Mysql中的写法

  Mysql的写法很多,网上许多使用自建函数的,这里介绍一种更为通用的方法。

1、由父项递归下级

SELECT t3.*
FROM
(
SELECT t1.id,t1.parentid,t1.text,
IF ( find_in_set( t1.parentid, @pids ) > 0, @pids := concat( @pids, ',', t1.id ), 0 ) AS ischild
FROM
( SELECT id,text,parentid FROM treeview t WHERE 1 = 1 ORDER BY parentid, id ) t1,
( SELECT @pids := 450 ) t2 --替换成自己想要查询的id
) t3
WHERE t3.ischild != 0

 2、由子级递归父项

SELECT id,text,parentid,t1.lvl
FROM (
SELECT
@r AS _id,
(SELECT @r := parentid FROM treeview WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 450, @l := 0) vars, --替换成自己想要查询的id
treeview h
WHERE @r <> 0
) T1
JOIN treeview T2 ON T1._id = T2.id
ORDER BY id;

  

简单的例子,供大家学习参考。 

  

Sql递归查询,Sqlserver、Oracle、PG、Mysql的更多相关文章

  1. 数据库 --> SQL Server 和 Oracle 以及 MySQL 区别

    SQL Server 和 Oracle 以及 MySQL 区别 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非 ...

  2. 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比

    SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...

  3. SQL Server、Oracle和MySQL判断NULL的方法

    SQL Server.Oracle和MySQL判断NULL的方法 本文讲述SQL Server.Oracle.MySQL查出值为NULL的替换. 在SQL Server Oracle MySQL当数据 ...

  4. SQL Server 和 Oracle 以及 MySQL 数据库

    推荐:https://www.zhihu.com/question/19866767 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Or ...

  5. SQL Server 和 Oracle 以及 MySQL 有哪些区别?

    SQL,在这里我理解成SQL Server.三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了. ...

  6. SQL Server、Oracle和MySQL中查出值为NULL的替换

    参考文献: http://database.51cto.com/art/200803/67397.htm 正文 在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1 ...

  7. 三种数据库日期转字符串对照sql server、oracle、mysql(V4.11)

    三种数据库日期转换对照: http://blog.csdn.net/zljjava/article/details/17552741 SQL类型转换函数:cast(type1 as type2) 数据 ...

  8. Sql Server、Oracle、MySQL 日期格式化函数处理

    目录 Sql Server Oracle MySql Sql Server CONVERT ( '取数长度' , '时间' , '类型') 查询对应时间: 2021-03-17T19:18:18.00 ...

  9. Vertica的这些事(二)——SQL-Server、Oracle、MySQL和Vertica数据库常用函数对比

    SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 绝对值 S:select abs(-1) value O ...

  10. 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库

    目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...

随机推荐

  1. PHP命令执行集锦

    前言 代码审计总要遇到命令执行或者说RCE,打CTF的过程中难免不会碰见,毕竟PHP是世界上最好的语言,总结一下 命令执行函数 E.g.1 <?php error_reporting(0); s ...

  2. 阿里云服务器搭建vulhub靶场

    阿里云服务器搭建vulhub靶场 环境 服务器:阿里云服务器 系统:centos7 应用:vulhub 步骤 vulhub需要依赖docker搭建,首先安装docker. 使用以下方法之一: # cu ...

  3. c++-投骰子

    #include<iostream>#include<cstdlib>//产生随机数的函数using namespace std;enum GameStatus{WIN,LOS ...

  4. linux下查看文件编码及修改编码介绍

    1.在Vim中可以直接查看文件编码:set fileencoding即可显示文件编码格式.如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在~/.vimrc 文件中添 ...

  5. Arcgis更新sde库许可

    概述 一般来说SDE的试用许可我会建议用户在没有到期之前进行续期,也就是更新许可.否则的话,如果SDE试用许可到期了,除了PostgresSQL数据库之外,我们只能通过SQL语句的方式来进行更新.在到 ...

  6. hashlib 模块 摘要算法

    应用于用户登陆,对密码进行加密操作, #文件操作 # hashlib 摘要算法 #md5 算法: 是32位的16进制组成的数字字符组成的字符串 #应用最广的摘要算法 #效率高,相对不复杂,如果只是传统 ...

  7. CRI容器运行时

    CRI容器运行时 我们知道 Kubernetes 提供了一个 CRI 的容器运行时接口,那么这个 CRI 到底是什么呢?这个其实也和 Docker 的发展密切相关的. 在 Kubernetes 早期的 ...

  8. 怎么让一个div消失在视野里

    怎么让一个div消失在视野里 视野内隐藏 1.设置高度宽度为0 div { height: 0; width: 0; } 2.设置透明度为0 div { opacity: 0; } 3.设置displ ...

  9. Jquery是什么?有什么作用?

    Jquery是继prototype之后又一个优秀的Javascrīpt框架.它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safar ...

  10. redis 如何做内存优化?

    1.缩减键值对象 缩减键(key)和值(value)的长度, key长度:如在设计键时,在完整描述业务情况下,键值越短越好. value长度:值对象缩减比较复杂,常见需求是把业务对象序列化成二进制数组 ...