标签: recursive-query

除Oracle之外的RDBMS中的CONNECT BY或分层查询

Oracle提供了非常方便的功能.您可以使用以下子句创建分层查询(递归行为):

CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]
Run Code Online (Sandbox Code Playgroud)

如此处所述:

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm

我想知道,有没有其他已建立的RDBMS支持等效或类似的语法?或者可以使用常规SQL一般模拟这样的递归行为?

我希望能够模拟的一个很好的例子是(取自Oracle文档):

    SELECT LPAD(' ', 2 * (LEVEL-1)) || last_name org_chart, 
           employee_id, manager_id, job_id
      FROM employees
START WITH job_id = 'AD_VP' 
CONNECT BY PRIOR employee_id = manager_id; 
Run Code Online (Sandbox Code Playgroud)

导致:

ORG_CHART          EMPLOYEE_ID MANAGER_ID JOB_ID
------------------ ----------- ---------- ----------
Kochhar                    101        100 AD_VP
  Greenberg                108        101 FI_MGR
    Faviet                 109        108 FI_ACCOUNT
    Chen                   110        108 FI_ACCOUNT
    Sciarra                111        108 FI_ACCOUNT
    Urman                  112        108 FI_ACCOUNT
    Popp                   113        108 FI_ACCOUNT
  Whalen                   200        101 AD_ASST …
Run Code Online (Sandbox Code Playgroud)

sql oracle simulation connect-by recursive-query

6
推荐指数
2
解决办法
6113
查看次数

PostgreSQL通过2个父/子表递归递归

我想为树木育种项目创建一个线性祖先列表.父母是男性/女性对,不得相关(没有近亲繁殖),因此追踪和可视化这些血统的重要性......

下面是使用Postgresql 9.1的测试表/数据:

DROP TABLE if exists family CASCADE;
DROP TABLE if exists plant CASCADE;

CREATE TABLE family (   
  id serial,
  family_key VARCHAR(20) UNIQUE,
  female_plant_id INTEGER NOT NULL DEFAULT 1,  
  male_plant_id INTEGER NOT NULL DEFAULT 1,   
  filial_n INTEGER NOT NULL DEFAULT -1,  -- eg 0,1,2...  Which would represent None, F1, F2... 
  CONSTRAINT family_pk PRIMARY KEY (id)
);

CREATE TABLE plant ( 
  id serial,
  plant_key VARCHAR(20) UNIQUE,
  id_family INTEGER NOT NULL,  
  CONSTRAINT plant_pk PRIMARY KEY (id),
  CONSTRAINT plant_id_family_fk FOREIGN KEY(id_family) REFERENCES …
Run Code Online (Sandbox Code Playgroud)

postgresql recursive-query common-table-expression

6
推荐指数
1
解决办法
1810
查看次数

从tsql中的行集数据(具有特定id)获取所有树

我的数据在表中有2个字段,Id和ParentId.我用这种结构存储数据(下面的类似图像).如何获得包含Id = 6的从叶到根的所有路径?(结果样本如下)

--Data structure is as follow :
--  1
-- /
--2 <- 3       9
-- \    \    / 
--  4 <- 5  7  8
--    \  /  /  /
--      6 - - -
--   /    \
--  10  <- 11
-- /
--12

--Data In Table Is :
--Id    ParentId
--1     null
--2     1
--3     2
--4     2
--5     3
--5     4
--6     4
--6     5
--6     7
--6     8
--7     9
--8     null
--9     null …
Run Code Online (Sandbox Code Playgroud)

t-sql tree recursive-query

6
推荐指数
1
解决办法
316
查看次数

使用sql进行递归计算以形成树

我正在研究一个简单的问题,并希望使用SQL来解决它.我有3个表类别,项目和关系表CategoryItem.我需要返回每个类别的项目数,但扭曲是类别按父子关系排列,子类别中的项目数应该添加到其父类别中的计数.请使用SQL考虑下面的示例数据和预期的结果集.

Id  Name    ParentCategoryId
1   Category1   Null
2   Category1.1 1
3   Category2.1 2
4   Category1.2 1
5   Category3.1 3

ID  CateoryId   ItemId
1   5              1
2   4              2
3   5              2
4   3              1
5   2              3
6   1              1
7   3              2
Run Code Online (Sandbox Code Playgroud)

结果:

CategoryNAme     Count
Category1          7
Category1.1        5
Category2.1        4
Category1.2        1
Category3.1        2
Run Code Online (Sandbox Code Playgroud)

我可以在我的业务层中执行此操作,但由于数据大小,性能并非最佳.我希望如果我能在数据层中做到这一点,我将能够大大提高性能.

在此先感谢您的回复

sql t-sql sql-server recursive-query

6
推荐指数
1
解决办法
1205
查看次数

计算产品库存的加权平均成本

我必须计算产品的库存成本,因此对于每次购买后的每种产品,我必须重新计算加权平均成本

我认为每次进出后都会带给我当前产品的库存:

document_type   document_date   product_id  qty_out qty_in  price       row_num stock_balance
SI              01/01/2014      52          0       600     1037.28     1           600
SI              01/01/2014      53          0       300     1357.38     2           300
LC              03/02/2014      53          100     0       1354.16     3           200
LC              03/02/2014      53          150     0       1355.25     4           50
LC              03/02/2014      52          100     0       1035.26     5           500
LC              03/02/2014      52          200     0       1035.04     6           300
LF              03/02/2014      53          0       1040    1356.44     7           1090
LF              03/02/2014      52          0       1560    1045        8           1860
LC              04/02/2014      52          120 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql recursive-query window-functions postgresql-9.3

6
推荐指数
2
解决办法
3857
查看次数

SQL Server等效于Oracle的"CONNECT BY PRIOR"和"ORDER SIBLINGS BY"

我有这个Oracle代码结构,我正在尝试转换为SQL Server 2008 (注意:我在方括号'[]'中使用了通用名称,封闭的列名和表名,并做了一些格式化以使代码更多可读):

SELECT [col#1], [col#2], [col#3], ..., [col#n], [LEVEL] 
FROM (SELECT [col#1], [col#2], [col#3], ..., [col#n] 
      FROM [TABLE_1] 
      WHERE ... ) 
CONNECT BY PRIOR [col#1] = [col#2] 
START WITH [col#2] IS NULL 
ORDER SIBLINGS BY [col#3]
Run Code Online (Sandbox Code Playgroud)

什么是上述代码的SQL Server等效模板

具体来说,我正在努力与LEVEL和'ORDER SIBLINGS BY'Oracle构造.

注意: 上面的"代码"是一组Oracle过程的最终输出.基本上,'WHERE'子句是动态构建的,并根据传递的各种参数而变化.以"CONNECT BY PRIOR"开头代码块是硬编码的.


以供参考:

SQL SERVER文章中关于ORACLE的连接模拟很接近,但它没有解释如何处理'LEVEL'和'ORDER SIBLINGS'结构.......我的思绪在变化!

SELECT name 
  FROM emp
  START WITH name = …
Run Code Online (Sandbox Code Playgroud)

sql-server oracle connect-by recursive-query siblings

6
推荐指数
1
解决办法
2万
查看次数

如何使这个查询递归Sql Server?

我有Balances表的这个表结构:

在此输入图像描述

这就是观点:

在此输入图像描述

我对Amounts表也有这个结构:

在此输入图像描述

这是Amounts表的视图模式:

在此输入图像描述

首先,我需要在Amounts表中获取特定日期的金额值:

在此输入图像描述

有了这个查询,我在2016年7月7日获得了300金额.一旦达到这个数字,我需要使用Balances表进行递归查询.最终结果应该是这样的:

    Name   abstractAmount   addAmount  Balance
   -----   --------------   ---------  -------
   Josep                      100        400       
   Maria       50                        350
   George                     60         410
   Julianne    25                        385
Run Code Online (Sandbox Code Playgroud)

这是什么?这个结果是从Amounts表中取300来实现的,而对于Balance表中的每一行,我看到:如果第一行中的abstracAmount不为空,我进行这个数学计算:balance =(300 - abstractAmount),万一是empty和addAmount列有值我做这个数学计算balance =(300 + addAmount)在其余的行中我做同样但计算不在300,在最后一行上是平衡:例如:在第一行余额为400,因为addamount有值,所以我进行此计算:300 + 100 = 400在第二行中,余额为350,因为abstractAmount不为空,所以我取最后一行的余额值进行此计算:400 - 50 = 350.对于其余行,同样的事情,只有第一行采用金额表的余额值.

注意:
1.始终列abstractAmount减去值和addAmount列的总和值.

  1. 始终其中一列(abstractAmount | addAmount)将为空.

  2. 只有第一行获取值才能对Amounts表进行数学计算,其余行将获取之前行的值.

我怎样才能得到这个最终结果?:

       Name     abstractAmount  addAmount   Balance
       -----   --------------   ---------  -------
       Josep                      100        400       
       Maria       50                        350
       George                     60         410
       Julianne    25                        385
Run Code Online (Sandbox Code Playgroud)

我接受建议,谢谢.

sql sql-server recursive-query sql-server-2014

6
推荐指数
1
解决办法
74
查看次数

Recursion On Database Query使用Hibernate获取分层结果 - Java

我的Oracle数据库中有一个表与子父关系,如 -

在此输入图像描述

我需要的是在Hibernate中以分层方式访问子列表.

  • 当父亲登录时 - 他将儿子当作儿子.
  • 当祖父登录时 - 他得到了儿子,父亲,叔叔.
  • 当超级祖父登录时 - 他得到了儿子,父亲,叔叔和祖父.

我也有一个java实体.

public class relations {
    private String child;
    private String parent;
    public getChild();
    public getParent();
    public setChild();
    public setParent();
}
Run Code Online (Sandbox Code Playgroud)

如何对此进行递归?

我应该通过在SQL中编写一个命名查询来获取列表,或者它可以在java hibernate中实现吗?

我正在寻找的是在java中编写递归代码.提前致谢.

java sql oracle hibernate recursive-query

6
推荐指数
1
解决办法
3833
查看次数

SQL Server CTE层次结构问题

我有一个应用程序服务多级权限和角色

我有这个HIERARCHY:


国家

....区域

........市

............协会

................中央

....................学校

........................类


这个HIERARCHY我把它命名为"EntityLevels"

| ID | Name        | ParentID |
|----|-------------|----------|
| 1  | Country     | Null     |
| 2  | Region      | 1        |
| 3  | City        | 2        |
| 4  | Association | 3        |
| 5  | Center      | 4        |
| 6  | School      | 5        |
| 7  | Class       | 6        |
Run Code Online (Sandbox Code Playgroud)

我还有一个群组表,这意味着乔布斯

| ID | Name               | EntityLevels |
|----|--------------------|--------------|
| 1  | CountryAdmins …
Run Code Online (Sandbox Code Playgroud)

sql-server recursive-query common-table-expression hierarchical-data

6
推荐指数
2
解决办法
162
查看次数

自上而下的树postgres的递归路径聚合和CTE查询

我正在尝试编写一个查询,以生成给定根的树中所有节点的列表,以及路径(使用父级给他们孩子的名称)到达那里的路径.我工作的递归CTE是直接来自这里的文档的教科书CTE ,然而,事实证明在这种情况下使路径工作很困难.

在git模型之后,由于遍历树创建的路径,父母会将名称提供给子级.这意味着映射到git的树结构等子id.

我一直在网上寻找递归查询的解决方案,但它们似乎都包含使用父ID或物化路径的解决方案,这些都会破坏Rich Hickey的数据库作为价值谈话的结构共享概念.

目前的实施

想象一下,对象表很简单(为简单起见,我们假设整数id):

drop table if exists objects;
create table objects (
    id INT,
    data jsonb
);

--       A
--     /   \
--    B     C
--   /   \    \
--  D     E    F

INSERT INTO objects (id, data) VALUES
  (1, '{"content": "data for f"}'),  -- F
  (2, '{"content": "data for e"}'),  -- E
  (3, '{"content": "data for d"}'),  -- D
  (4, '{"nodes":{"f":{"id":1}}}'),               -- C
  (5, '{"nodes":{"d":{"id":2}, "e":{"id":3}}}'), -- B
  (6, …
Run Code Online (Sandbox Code Playgroud)

postgresql recursive-query common-table-expression

6
推荐指数
1
解决办法
4488
查看次数