Sql递归查询,Sqlserver、Oracle、PG、Mysql
递归分两种:一种由父项向下级递归,另一种是由子项向上级递归。下面就这两种情况做个简单的处理。
假设有一个表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的更多相关文章
- 数据库 --> SQL Server 和 Oracle 以及 MySQL 区别
SQL Server 和 Oracle 以及 MySQL 区别 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非 ...
- 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...
- SQL Server、Oracle和MySQL判断NULL的方法
SQL Server.Oracle和MySQL判断NULL的方法 本文讲述SQL Server.Oracle.MySQL查出值为NULL的替换. 在SQL Server Oracle MySQL当数据 ...
- SQL Server 和 Oracle 以及 MySQL 数据库
推荐:https://www.zhihu.com/question/19866767 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Or ...
- SQL Server 和 Oracle 以及 MySQL 有哪些区别?
SQL,在这里我理解成SQL Server.三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了. ...
- SQL Server、Oracle和MySQL中查出值为NULL的替换
参考文献: http://database.51cto.com/art/200803/67397.htm 正文 在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1 ...
- 三种数据库日期转字符串对照sql server、oracle、mysql(V4.11)
三种数据库日期转换对照: http://blog.csdn.net/zljjava/article/details/17552741 SQL类型转换函数:cast(type1 as type2) 数据 ...
- Sql Server、Oracle、MySQL 日期格式化函数处理
目录 Sql Server Oracle MySql Sql Server CONVERT ( '取数长度' , '时间' , '类型') 查询对应时间: 2021-03-17T19:18:18.00 ...
- Vertica的这些事(二)——SQL-Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 绝对值 S:select abs(-1) value O ...
- 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库
目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...
随机推荐
- 源码安装Vim并配置YCM自动补全插件
Compiling Vim from source is actually not that difficult. Here's what you should do: 1. Install all ...
- 关于Stream系列实战
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错
在docker部署mysql时 报错 找不到 容器不自动启动 , docker start 容器名 也没有效果 多次尝试发现 原因是创建容器时在 下面创建的 更改为下创建 问题解决
- 串和KMP算法
一.串 串是由零个或多个字符串组成的有限序列 (一).串的定义 定长顺序存储 特点:每个串变量分配一个固定长度的存储区,即定长数组 定义: #define MAXLEN 255 typedef str ...
- &取地址运算符
&可以取得一个变量在内存当中的地址 Register int a; //这种变量不在内存里面,而在CPU里面,是没有地址的, 所以寄存器变量(register)不能用&来取得变量 在计 ...
- CF1225E Rock Is Push (计数)
观察性质计数题orz小贺 考场上跟榜才切 我们只能往下和往右走,那么只有连续的往下和往右可能会造成不合法的情况!如果当前这一步是向右,那么只有它前面连续的一段向右可能影响到它. 考虑把连续的向右/下一 ...
- 图解CompletableFuture源码
前言 关于CompletableFuture源码解析部分,整体上感觉还是写比较难的,不过为了推广到团队还是要好好搞一下的,我还是希望大家看到这边文章能学到点什么,废话不多说开始吧. 属性部分 首先看属 ...
- automake的使用2
前言 如果你的入口文件main.c和依赖的文件不是在同一个目录中的,使用Autotools来管理项目的时候会稍微复杂一下. 在不同的目录下,项目会生成*.a文件的静态连接(静态连接相当于将多个.o目标 ...
- 学习廖雪峰的Git教程1
我是在Ubuntu上学习的,所以配置之类的进行的很快. 一.创建版本库 mkdir learngit cd learngit git init 用git init变成git可以管理的库 二.git a ...
- 在Windows环境下构建Lua 入门
在Windows环境下构建Lua 一:准备软件 1.C-compiler(TDM GCC) http://tdm-gcc.tdragon.net/download 2.Lua源代码 http:// ...