我正在使用以下公用表表达式来解析自引用表.但CTE不起作用,产生无限循环并产生错误:
Msg 530,Level 16,State 1,Line 1声明终止.在语句完成之前,最大递归100已用尽.
如何修改此CTE以使其工作?
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL DROP TABLE dbo.Employees;
CREATE TABLE dbo.Employees
(
empid INT NOT NULL PRIMARY KEY,
mgrid INT NULL REFERENCES dbo.Employees,
empname VARCHAR(25) NOT NULL,
salary MONEY NOT NULL,
CHECK (empid > 0)
);
INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES
(1, 1, 'David' , $10000.00),
(2, 1, 'Eitan' , $7000.00),
(3, 1, 'Ina' , $7500.00),
(4, 2, 'Seraph' , $5000.00),
(5, 2, 'Jiru' , …Run Code Online (Sandbox Code Playgroud) 我在数据库中有每个标识符的以下2条信息.控制它们的公司,以及控制它们的公司.
沿线的东西,2个表(忽略一些唯一标识符):
组织
orgid | org_immediate_parent_orgid
1 | 2
2 | 2
3 | 1
5 | 4
Run Code Online (Sandbox Code Playgroud)
关系orgid - > org_immediate_parent_orgid意味着公司有父母.在我看来它只有相关的org_immediate_parent_orgid - > orgid公司的母公司作为子公司
org_affiliations
orgid | affiliated_orgid
2 | 3
2 | 5
4 | 1
1 | 5
Run Code Online (Sandbox Code Playgroud)
orgid - > affiliated_orgid是公司的附属机构
视觉表示应该是这样的:

关于组织的红色关系,蓝色关系org_affiliations.
如果想让2所有的所有公司(或2的子公司)拥有它们的一部分:
select m.org_immediate_parent_orgid
,m.orgid
from oa.organizations m
where m.org_immediate_parent_orgid is not null
start with m.orgid in (Identifiers)
connect by nocycle prior m.orgid=m.org_immediate_parent_orgid
Run Code Online (Sandbox Code Playgroud)
回报
org_immediate_parent_orgid| orgid
1 | 2
2 …Run Code Online (Sandbox Code Playgroud) 注意:在RhodiumToad的#postgresql帮助下,我已经找到了一个解决方案,我将其作为答案发布.如果有人可以改进这一点,请加入!
我无法使先前的递归查询解决方案适应包含多个"根"(无祖先)节点的以下有向非循环图.我正在尝试编写一个查询,其输出通常称为闭包表:一个多对多表,它存储从每个节点到每个后代及其自身的每条路径:
1 2 11 8 4 5 7
\/ | | \ | /
3 | \ 6
\ | \ /
9 | 10
\/ /
12 13
\ /
14
CREATE TABLE node (
id SERIAL PRIMARY KEY,
node_name VARCHAR(50) NOT NULL
);
CREATE TABLE node_relations (
id SERIAL PRIMARY KEY,
ancestor_node_id INT REFERENCES node(id),
descendant_node_id INT REFERENCES node(id)
);
INSERT into node (node_name)
SELECT 'node ' || g FROM generate_series(1,14) g;
INSERT INTO node_relations(ancestor_node_id, …Run Code Online (Sandbox Code Playgroud) 我有一个问题,我无法理解.我知道我想要什么,只是简直无法在屏幕上看到它.我有一个看起来像这样的表:
Id, PK UniqueIdentifier, NotNull
Name, nvarchar(255), NotNull
ParentId, UniqueIdentifier, Null
Run Code Online (Sandbox Code Playgroud)
ParentId有一个FK到Id.
我想要完成的是获得我传入的Id下方所有id的平面列表.
例:
1 TestName1 NULL
2 TestName2 1
3 TestName3 2
4 TestName4 NULL
5 TestName5 1
Run Code Online (Sandbox Code Playgroud)
树看起来像这样:
-1
-> -2
-> -3
-> -5
-4
Run Code Online (Sandbox Code Playgroud)
如果我现在要求4,我只会回来4,但如果我要求1,我会得到1,2,3和5.如果我要求2,我会得到2和3,依此类推.
有谁能指出我正确的方向.我的大脑很油炸,所以我很感激能得到的所有帮助.
我遇到了这个用于连接行元素的CTE解决方案,我认为它很棒,我意识到CTE有多强大.
但是,为了有效地使用这样的工具,我需要知道它如何在内部工作以构建心理图像,这对于像我这样的初学者来说在不同场景中使用它是必不可少的.
所以我试着慢动作上面代码片段的过程,这里是代码
USE [NORTHWIND]
GO
/****** Object: Table [dbo].[Products2] Script Date: 10/18/2011 08:55:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('Products2','U') IS NOT NULL DROP TABLE [Products2]
CREATE TABLE [dbo].[Products2](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[ProductName] [nvarchar](40) NOT NULL,
[SupplierID] [int] NULL,
[CategoryID] [int] NULL,
[QuantityPerUnit] [nvarchar](20) NULL,
[UnitPrice] [money] NULL,
[UnitsInStock] [smallint] NULL,
[UnitsOnOrder] [smallint] NULL,
[ReorderLevel] [smallint] NULL,
[Discontinued] [bit] NOT NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Products2] ON
INSERT [dbo].[Products2] …Run Code Online (Sandbox Code Playgroud) PostgreSQL 9.1
经营情况
每个月都有一批特定流程的新帐户.每个批次都可以按月份,帐户数量和帐户总余额来描述.该过程的目标是从客户那里恢复一些平衡.然后每月单独跟踪每批次(自批次转移到流程以来每月回收的金额).
目标
我的目标是预测将来会收回多少金额.
数据定义
create table vintage_data (
granularity date, /* Month when account entered process*/
distance_in_months integer, /* Distance in months from date when accounts entered process*/
entry_accounts integer, /* Number of accounts that entered process in a given month*/
entry_amount numeric, /* Total amount for account that entered process in a given month*/
recovery_amount numeric /* Amount recovered in Nth month on accounts that entered process in a given month */
);
Run Code Online (Sandbox Code Playgroud)
样本数据
insert into …Run Code Online (Sandbox Code Playgroud) 我有两个表,表1有2个字段(question_pk,question_name),表2有4个字段(ans_pk,options,question_fk和right_answer).我想像以下结构一样创建json
{
"type": "quiz",
"name": "Brand Colors",
"description": "Can you identify these brands by the background color?",
"questions": [
{
"name": "Can you identify this color?",
"description": "#ea4c89",
"answers": [
{
"name": "Dribbble",
"description": "dribbble.png",
"weight": 1
},
{
"name": "Amazon",
"description": "amazon.png",
"weight": 0
},
{
"name": "Apple",
"description": "apple.png",
"weight": 0
}
]
},
{
"name": "Can you identify this color?",
"description": "#3d9ae8",
"answers": [
{
"name": "Youtube",
"description": "youtube.png",
"weight": 0
},
{
"name": "Dropbox",
"description": …Run Code Online (Sandbox Code Playgroud) 我有一个数据表,其中包含媒体,文档,PDF和文件夹列表.与Google云端硬盘相同,我想在数据表的顶部显示痕迹.数据表反映了通过jQuery点击任何文件夹时的更改.除了面包屑外,所有的东西都准备好了.我有当前打开的文件夹的ID,但我不知道如何从根到当前文件夹获取层次结构.
目前它给我父ID和名称而不是整个层次结构.
注意: - 列之间没有关系,因为它在同一个表中.
实体字段: -id, nameDisplay, parentId
实体定义: -
/**
* driveall
* @ORM\Table(name="Driveall")
* @ORM\Entity(repositoryClass="DriveBundle\Repository\DriveallRepository")
*/
class Driveall
{
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @ORM\Column(name="Name_Display", type="string", length=255)
*/
private $nameDisplay;
/**
* @var int
* @ORM\Column(name="ParentID", type="integer")
*/
private $parentID;
/**
* Get id
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set nameDisplay
* …Run Code Online (Sandbox Code Playgroud) 我目前在理解和编写递归查询方面遇到了一些麻烦。我知道递归查询用于搜索信息的层次结构,但我还没有在网上找到一个可以向上移动层次结构的简单解决方案。例如,假设我有一个对家谱建模的关系:
create table family_tree (
child varchar(10)
parent varchar(10)
);
Run Code Online (Sandbox Code Playgroud)
如果我想编写一个递归查询,遍历这个家谱,收集所有父母直到起源,我应该怎么做?
提前致谢。
我有这个专栏:
names
John, Mary
Joseph
Eleanor, Sophia, Dani
Run Code Online (Sandbox Code Playgroud)
我想要这个输出:
names
John
Mary
Joseph
Eleanor
Sophia
Dani
Run Code Online (Sandbox Code Playgroud)
它应该包括 SUBSTRING_INDEX 函数