PG里的层次查询方法

2015-05-12  来源:本站原创  分类:数据库  人气:513 

今天开发人员咨询,他们项目有张表,表中的记录有父子关系,根据父记录ID,如何查询所有
子节点的记录, PG里是否有方法可以实现, 听到这,我还是第一次碰到PG的这种问题,想到Oracle
是有方法实现的,查询语法如下:

--像oracle里,查询语法如下
select * from aclorgtreeinfo
start with orgid = '06e0d0bb1389a196011389b31abd0002'
connect by prior orgid = parentorgid;

后来查了些文档发现PG里可以利用递归查询实现,具体用法可以参考
http://www.postgresql.org/docs/8.4/static/queries-with.html, 以下是具体测试过程。

--创建测试表,并插入测试记录
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)

从结果看出,果然功能实现了,"WITH RECURSIVE"有个特点,它不立即将执行结果输出,而是需要再通过
SELECT命令将结果输出到终端。

最后将以上方法告诉开发人员,开发人员开心死了 ^_^

相关文章
  • PG里的层次查询方法 2015-05-12

    今天开发人员咨询,他们项目有张表,表中的记录有父子关系,根据父记录ID,如何查询所有 子节点的记录, PG里是否有方法可以实现, 听到这,我还是第一次碰到PG的这种问题,想到Oracle 是有方法实现的,查询语法如下: --像oracle里,查询语法如下 select * from aclorgtreeinfo start with orgid = '06e0d0bb1389a196011389b31abd0002' connect by prior orgid = parentorgid; 后

  • Thinkphp使用mongodb数据库实现多条件查询方法 2013-12-27

    这篇文章主要介绍了Thinkphp使用mongodb数据库实现多条件查询方法,修改了mongodb驱动文件来实现复合查询.多条件查询,需要的朋友可以参考下 有个项目用了mongodb数据库,查询条件有and也有or,按Thinkphp官方手册,使用复合查询(_complex),getLastSql输出查询语句,发现查询条件是空的.用字符串模式查询(_string),请求字符串查询(_query)无法满足需求.估计用mongodb的用户不多,thinkphp官方对这方面支持也不够.打开thinkp

  • php+mysql快速随机查询方法 2015-03-24

    大家都知道MYSQL自带的"Order By Rand"数据量大时是非常缓慢的,于是有了各种优化的随机查询方法,这是我所知的最优的方法,不知道还有没有更快的,分亨下~ <?php // 先查询出表中最小的ID和最大的ID以作使用 $sql = "SELECT MIN(id) as min, MAX(id) as max FROM #@__table WHERE 1"; // 省略取值过程~,$row为结果{min,max} ...... // 生成要取的随机I

  • Python实现在线程里运行scrapy的方法 2014-01-27

    这篇文章主要介绍了Python实现在线程里运行scrapy的方法,涉及Python线程操作的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了Python实现在线程里运行scrapy的方法.分享给大家供大家参考.具体如下: 如果你希望在一个写好的程序里调用scrapy,就可以通过下面的代码,让scrapy运行在一个线程里. """ Code to run Scrapy crawler in a thread - works on Scrapy 0.8 "&

  • JavaScript通过join函数连接数组里所有元素的方法 2014-05-10

    这篇文章主要介绍了JavaScript通过join函数连接数组里所有元素的方法,实例分析了javascript中join函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了JavaScript通过join函数连接数组里所有元素的方法.分享给大家供大家参考.具体实现方法如下: <script type="text/javascript"> var days = ["Sunday","Monday","Tu

  • 在maven工程里运行java main方法 2014-06-13

    这篇文章主要介绍了在maven工程里运行java main方法,需要的朋友可以参考下 在Maven工程里运行Java main方法 mvn compile mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main" mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main" -Dexec.args="arg0 arg1 arg

  • php用ini_get获取php.ini里变量值的方法 2014-07-25

    这篇文章主要介绍了php用ini_get获取php.ini里变量值的方法,实例分析了ini_get函数的使用技巧,需要的朋友可以参考下 本文实例讲述了php用ini_get获取php.ini里变量值的方法.分享给大家供大家参考.具体分析如下: 要得到php.ini里的变量值,当然,你可以用phpinfo();来得到所有php配置信息,但如果要想得到某个变量值的话,你又要怎样获取呢? php里提供一个获取php.ini里的变量值的函数:ini_get() ini_get()的用法非常简单,下面通过

  • mysql.mssql及oracle分页查询方法详解 2014-10-03

    这篇文章主要介绍了mysql.mssql及oracle分页查询方法,实例分析了数据库分页的实现技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了mysql.mssql及oracle分页查询方法.分享给大家供大家参考.具体分析如下: 分页查询在web开发中是最常见的一种技术,最近在通过查资料,有一点自己的心得 一.mysql中的分页查询 注: m=(pageNum-1)*pageSize;n= pageSize; pageNum是要查询的页码,pageSize是每次查询的数据量, 方法一

  • Python实现从脚本里运行scrapy的方法 2014-10-10

    这篇文章主要介绍了Python实现从脚本里运行scrapy的方法,实例分析了Python脚本运行的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了Python实现从脚本里运行scrapy的方法.分享给大家供大家参考.具体如下: #!/usr/bin/python import os os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'project.settings') #Must be at the top before oth

  • MySQL大表中重复字段的高效率查询方法 2015-02-06

    MySQL大表重复字段应该如何查询到呢?这是很多人都遇到的问题,下面就教您一个MySQL大表重复字段的查询方法,供您参考 MySQL大表重复字段应该如何查询到呢?这是很多人都遇到的问题,下面就教您一个MySQL大表重复字段的查询方法,供您参考. 数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较. 如果仅仅是查找数据库中name不重复的字段,很容易 SELECT min(`id`),`name` FROM `table` GROUP BY `name`; 但是这样并不能得到说有重复字

  • Xqk.Data数据框架开发指南:丰富的.灵活的查询方法(第二部分:适应不同数据库系统的查询) 2011-11-06

    在上篇文章<丰富的.灵活的查询方法(第一部分)>提到,针对不同的开发任务,Xqk.Data数据框架提供了丰富的.灵活的查询方法,文章还介绍了一些查询方法,在这些方法中,大部分都有一个共同的whereStr参数,该参数用来表明查询条件,即SQL语句中紧跟WHERE关键字的部分.需要注意的是,不同的数据库系统都有一些特定的行为.因此,如果代码要想适应不同的数据库系统,请确保提供的whereStr能在不同数据库系统下都能正确执行,且能够得到相同的结果或行为,或者为不同的数据库系统提供不同的where

  • Oracle当中层次查询 2012-11-13

    语法格式: select [level], column, expr... from table [where condition] start with condition connect by [prior column1= column2 | column1 = prior column2]; 层次查询是通过start with和connect by子句标识的: 1.其中level关键字是可选的,表示等级,1表示root,2表示root的child,其他相同的规则. 2.From之后可以是

  • Oracle查询之层次查询示例 2012-11-18

    现在有一个需求: 在emp表中查询员工信息: ***的老板是*** 如果使用自连接,自然很容易就能查出结果. sql语句: select e.ename||'的老板是'||b.ename from emp e,emp b where e.mgr=b.empno; 结果如下: E.ENAME||'的老板是'||B.ENAME ---------------------------- FORD的老板是JONES SCOTT的老板是JONES JAMES的老板是BLAKE TURNER的老板是BLAK

  • MySql开启慢查询方法My.ini 2013-12-04

    1,配置开启 Linux: 在mysql配置文件my.cnf中增加 log-slow-queries=/var/lib/mysql/slowquery.log (指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log) long_query_time=2 (记录超过的时间,默认为10s) log-queries-not-using-indexes (log下来没有使用索引的query,可以根据情况决定是否开启) log-long-format (如果设置了,所

  • 提高关键字在百度里的排名的方法 2013-11-12

    1. 处理关键字: 首先收集很多与你的网站或产品有关的关键字了.接下来的工作就是把收集到的关键字进行组合,把它们组成常用的词组或短语.很多人在搜索的时候会使用两个或三个字组成词.据统计,平均是2.3个字.不要用普通的,单个字作为关键字.这样的关键字很难排到搜索引擎的前十位.例如:你有以下几个关键字:"搜索引擎.软件.提高",试着把他们组合为"搜索引擎软件"."搜索引擎提高"等.把字组成关键字短语有利于提高你网站的排名,你将会更有效提高你网站访问量

  • 存储过程里的递归 实现方法 2013-11-14

    一个二叉树的递归,找出左边最下面的一个点 id 自动编号 pid 父ID id_path 节点路径 flg 位置,0左边,1右边 ALTER PROCEDURE [dbo].[get_class] @class int, @return int output AS SELECT @return=isnull(( select top 1 id from class where [email protected] and flg=0 ),-2) if @return>-1 begin exec get_clas

  • JS调用CS里的带参方法实例 2013-12-27

    js调用CS里的方法有很多,我用一种简单的方法,如下,有需要的朋友可以参考一下 CS里 public string test() { return "Hello World"; } aspx 页面 复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>无标题页</title> <m

  • 修改jQuery Validation里默认的验证方法 2014-01-12

    在最近做的一个项目中,使用jQuery Validation验证日期,遇到的问题和一个没有预料到的情况是,在ASP.NET MVC 3的项目中,对于 input type="date" data-val="true"的元素,如果调用form的valid方法验证form,虽然我没有添加日期验证的设置 在最近做的一个项目中,使用jQuery Validation验证日期,遇到的问题和一个没有预料到的情况是,在ASP.NET MVC 3的项目中,对于 <input

  • jquery里的each使用方法详解 2014-12-21

    有个同事问我each使用方法,我把我知道的用法告诉他.他却说不是这样的.如是在网上小逛了一下,果然用法有很多.下面总结下大慨的使用方法. each()函数是基本上所有的框架都提供了的一个工具类函数,通过它,你可以遍历对象.数组的属性值并进行处理.jQuery和jQuery对象都实 现了该方法,对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话 说:jQuery提供的each方法是对参数一提供的对象的中所有的子元素逐一

  • MSSQL内连接inner join查询方法 2015-04-15

    sql内连接查询代码,实例分析inner join实现方法 今天项目遇到一直不知道怎么解决,在经典网友以及无忧网友的热心帮助下,解决. 比如A表: sid sname 1 kkkkkkd 2 ahuinan B表 id smoney sid 1 100 1 2 200 1 3 150 2 希望得到的结果: sid sname smoney 1 kkkkkkd 300(100+200) 2 ahuinan 150 参考: select A.Sname,sum(B.Smoney) As Smoney