pgSQL的WITH和RECURSIVE是什么意思??高分求教!!!

love_u_qt 2011-11-17 11:32:04
公司有一条SQL语句写的是:
WITH RECURSIVE r AS (
SELECT * FROM test1 as t WHERE m_id = 18
union ALL
SELECT t.* FROM trade.merchant as t, r WHERE tree.par = r.m_id
)
SELECT * FROM r where stat = 1 ORDER BY m_id

实在是看不懂,上网找了找介绍WITH、和RECURSIVE的教程,都没讲的细的,就官方手册讲的全点,但我英文不好~
能大概介绍一下(最好有个小例子)这俩命令怎么用吗?另外它里面的t.*是什么意思?

谢谢!
...全文
571 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2011-11-17
  • 打赏
  • 举报
回复
递归

一般是在组织构架查询的时候使用。进行递归查询。
wwwwb 2011-11-17
  • 打赏
  • 举报
回复
example:
ITH RECURSIVE。 使用RECURSIVE选项 参数后,可以 输出自己想要的。
例子1:1到100的和
WITH RECURSIVE t(n) AS (
VALUES (1)
union ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;
输出结果:5050

例子2:取得一棵树的所有孩子节点
WITH RECURSIVE r AS (
SELECT * FROM tree WHERE id = 1
union ALL
SELECT tree.* FROM tree, r WHERE tree.parent = r.id
)
SELECT * FROM r ORDER BY id;
id | parent
----+--------
1 |
2 | 1
3 | 1
4 | 3
wwwwb 2011-11-17
  • 打赏
  • 举报
回复
这是递归查询
love_u_qt 2011-11-17
  • 打赏
  • 举报
回复
非常感谢二位的回答!!!讲的非常透彻!!!!谢谢!!!!
wwwwb 2011-11-17
  • 打赏
  • 举报
回复
PS的HELP也没有讲得非常仔细,个人理解 :
1、
SELECT * FROM emp WHERE empid = 2 执行后,存入1个临时表
2、
执行 SELECT emp.* FROM emp, r WHERE emp.empparid = r.empid ,
结果为
5 | 2 | MANAGER
3、继续执行 SELECT emp.* FROM emp, r WHERE emp.empparid = r.empid 直到
记录集为空(没有满足条件的记录);
4、将1、2、3的结果UNION ALL后输出。
wwwwb 2011-11-17
  • 打赏
  • 举报
回复
t.*应是trade.merchant表中的内容
create table emp (empid integer,empparid integer,empname varchar(32));
insert into emp values (001,nul,'CEO');
insert into emp values (002,001,'CTO');
insert into emp values (003,001,'CFO');
insert into emp values (004,001,'OOO');
insert into emp values (005,002,'MANAGER');

mydb=> select * from emp;
empid | empparid | empname
-------+----------+---------
2 | 1 | CTO
3 | 1 | CFO
4 | 1 | OOO
5 | 2 | MANAGER


--查询empid=2下的所有记录
WITH RECURSIVE r AS (
SELECT * FROM emp WHERE empid = 2
union ALL
SELECT emp.* FROM emp, r WHERE emp.empparid = r.empid
)
SELECT * FROM r ORDER BY empid;

empid | empparid | empname
-------+----------+---------
2 | 1 | CTO
5 | 2 | MANAGER
(2 rows)
这个示例能明白吧?

ACMAIN_CHM 2011-11-17
  • 打赏
  • 举报
回复
WITH RECURSIVE r AS (
SELECT * FROM test1 as t WHERE m_id = 18
union ALL
SELECT t.* FROM trade.merchant as t, r WHERE tree.par = r.m_id
)
SELECT * FROM r where stat = 1 ORDER BY m_id


它会一直递归调用,直到没有记录返回。

第一步,会得到 SELECT * FROM test1 as t WHERE m_id = 18 ,一条记录。并放在R中
然后再执行 SELECT t.* FROM trade.merchant as t, r WHERE tree.par = r.m_id 放入R中。 之后不断循环这一步。
love_u_qt 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwwb 的回复:]
example:
ITH RECURSIVE。 使用RECURSIVE选项 参数后,可以 输出自己想要的。
例子1:1到100的和
WITH RECURSIVE t(n) AS (
VALUES (1)
union ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;
输出结……
[/Quote]

这个例子我看过~研究了好半天还是没太看明白,都不知道它的语法是怎么回事~

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧