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) 我想为树木育种项目创建一个线性祖先列表.父母是男性/女性对,不得相关(没有近亲繁殖),因此追踪和可视化这些血统的重要性......
下面是使用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) 我的数据在表中有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) 我正在研究一个简单的问题,并希望使用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)
我可以在我的业务层中执行此操作,但由于数据大小,性能并非最佳.我希望如果我能在数据层中做到这一点,我将能够大大提高性能.
在此先感谢您的回复
我必须计算产品的库存成本,因此对于每次购买后的每种产品,我必须重新计算加权平均成本。
我认为每次进出后都会带给我当前产品的库存:
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
我有这个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) 我有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列的总和值.
始终其中一列(abstractAmount | addAmount)将为空.
只有第一行获取值才能对Amounts表进行数学计算,其余行将获取之前行的值.
我怎样才能得到这个最终结果?:
Name abstractAmount addAmount Balance
----- -------------- --------- -------
Josep 100 400
Maria 50 350
George 60 410
Julianne 25 385
Run Code Online (Sandbox Code Playgroud)
我接受建议,谢谢.
我的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中编写递归代码.提前致谢.
我有一个应用程序服务多级权限和角色
我有这个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
我正在尝试编写一个查询,以生成给定根的树中所有节点的列表,以及路径(使用父级给他们孩子的名称)到达那里的路径.我工作的递归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) recursive-query ×10
sql ×5
sql-server ×4
oracle ×3
postgresql ×3
connect-by ×2
t-sql ×2
hibernate ×1
java ×1
siblings ×1
simulation ×1
tree ×1