标签: recursive-query

将 RECURSIVE 作为查询中的第二部分 CTE。Postgres

我如何编写这样的查询:

with t1 as 
(
select id 
from table1
),
RECURSIVE t2(
select * from t2
union
...
)
Run Code Online (Sandbox Code Playgroud)

目前不允许?

postgresql recursive-query common-table-expression

7
推荐指数
1
解决办法
1877
查看次数

查询邻接列表中最远的孩子

所以我有一个SQL查询来检索邻接列表中给定节点的所有子节点.

WITH    RECURSIVE
        q AS
        (
        SELECT  id, name
        FROM    categories h
        WHERE   id = 11846801
        UNION ALL
        SELECT  hc.id, hc.name
        FROM    q
        JOIN    categories hc
        ON      hc.parent = q.id
        )
SELECT  name
FROM    q
Run Code Online (Sandbox Code Playgroud)

有没有修改该查询返回我的方式只是节点的最底层?我不能只指定给定的级别,因为每条路径可能有不同的深度.

sql postgresql recursive-query adjacency-list

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

在postgres中防止和/或检测周期

假设有如下模式:

CREATE TABLE node (
  id       SERIAL PRIMARY KEY,
  name     VARCHAR,
  parentid INT REFERENCES node(id)
);
Run Code Online (Sandbox Code Playgroud)

此外,我们假设存在以下数据:

INSERT INTO node (name,parentid) VALUES
('A',NULL),
('B',1),
('C',1);
Run Code Online (Sandbox Code Playgroud)

有没有办法防止创建周期?例:

UPDATE node SET parentid = 2 WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

这将创造一个循环 1->2->1->...

postgresql triggers plpgsql recursive-query

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

在 SQL 中复制父子结构

我有一张桌子MODELS,有几个ITEMS可以属于。该ITEMS表是一个分层表,PARENT列上有一个自联接。根级别的项目将NullPARENT. 项目可以深入任何级别。

create table MODELS (
   MODELID              int                  identity,
   MODELNAME            nvarchar(200)         not null,
   constraint PK_MODELS primary key (MODELID)
)
go

create table ITEMS (
   ITEMID               int                  identity,
   MODELID              int                  not null,
   PARENT               int                  null,
   ITEMNUM              nvarchar(20)         not null,
   constraint PK_ITEMS primary key (ITEMID)
)
go

alter table ITEMS
   add constraint FK_ITEMS_MODEL foreign key (MODELID)
      references MODELS (MODELID)
go

alter table ITEMS
   add constraint FK_ITEMS_ITEMS foreign key (PARENT)
      references …
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures recursive-query sql-server-2008

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

在SQL中实现递归查询

我有一个关于使用递归SQL的问题,其中我有以下表结构

产品可以分为多组(为了清楚起见,我不使用int)

CREATE TABLE ProductGroups(ProductName nvarchar(50), GroupName nvarchar(50))

INSERT INTO ProductGroups(ProductName, GroupName) values 
('Product 1', 'Group 1'),
('Product 1', 'Group 2'),
('Product 2', 'Group 1'),
('Product 2', 'Group 6'),
('Product 3', 'Group 7'),
('Product 3', 'Group 8'),
('Product 4', 'Group 6')


+-----------+---------+
|  Product  |  Group  |
+-----------+---------+
| Product 1 | Group 1 |
| Product 1 | Group 2 |
| Product 2 | Group 1 |
| Product 2 | Group 6 |
| Product 3 | …
Run Code Online (Sandbox Code Playgroud)

sql sql-server recursive-query

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

如何保证Postgres中递归CTE至少返回N行

SELECT TOP ...在Postgres 中描述查询的大多数资源都说你应该使用LIMIT,ORDER BY如果需要通过某种顺序选择顶部元素,可能使用子句.

你会怎么做,如果你需要选择一个递归查询,那里是没有排序的前N个元素和有可能的查询可以在不递归返回N多行少(这样TOP的部分是必要的,以确保结果set 至少是 N行,而LIMIT可以允许更少的行)?

我的具体用例是动态SQL模式的修改,用于选择表的随机子样本.

这是我修改的sql源链接.最简单的方法是查看那里定义的最终函数_random_select.它紧跟上述链接,但在输入表和输出结果集中已经被修改为多态,并且正确地说明了只返回输入表中已经存在的列的需要(还有另一个动态SQL)黑客row_number从最终结果集中排除中期结果).

这是一个眼睛,但它是我最接近可重复的例子.如果您使用_random_select并尝试从大于4500行的表中获取大约4500行的内容,则会开始以较高的概率看到较小的结果集,并且只会随着您增加所需样本的大小而变得更糟(因为重复的出现随着你想要的样本变大,情况会变得更糟)

请注意,在我的修改中,我没有使用_gaps此链接中的技巧,如果某个索引列中存在间隙,则意味着过度采样以抵消采样效率低下.那部分与这个问题无关,在我的情况下,我row_number用来确保有一个整数列,没有可能的间隙.

CTE的是递归的,以确保如果CTE的第一,非递归部分不给你足够的行(因为被去除重复的UNION),那么它会回去经过一轮又一轮的CTE的递归调用,并继续坚持更多的结果,直到你有足够的.

在链接的示例中,LIMIT使用,但我发现这不起作用.该方法返回的结果较少,因为最多LIMIT只能保证N行.

你如何获得至少 N行保证?选择TOPN行似乎是执行此操作的自然方式(因此递归CTE必须保持一直持续直到它获得足够的行来满足TOP条件),但这在Postgres中不可用.

sql postgresql recursive-query common-table-expression sql-limit

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

自上而下的树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
查看次数

使用CTE在自引用表中递归删除行.这个过程是如何进行的?

我正在研究一个辅助项目,为了在自引用表中删除一行及其所有后代,我在触发器中使用这样的递归CTE:

CREATE TRIGGER dbo.tr_Comment_Delete
    ON dbo.Comment INSTEAD OF DELETE
AS
    ;WITH IDs AS (
       SELECT id FROM DELETED
       UNION ALL
       SELECT c.id
       FROM Comment AS c INNER JOIN IDs AS i 
        ON c.parent_comment_id = i.id
    )
    DELETE FROM Comment
    WHERE id IN (SELECT id FROM IDs);
GO
Run Code Online (Sandbox Code Playgroud)

这是自引用表

在此输入图像描述

虽然我有这个代码按预期工作,但这是你做某事的情况之一,但你不太确定它是如何工作的.

更确切地说,我想知道的是,通过使用这种递归CTE(ID),当我尝试删除具有子注释的注释时,我能够避免引用完整性错误吗?

删除评论的过程/顺序是什么?

以此评论层次为例:

3-> 8-> 13 
Run Code Online (Sandbox Code Playgroud)

这里,id 3的注释是根注释.评论8是对评论3的回复,就像评论13是对评论8的回复一样.

删除过程实际上是如何进行的?

PS我尝试添加一个表格,我在计算时插入了ID.不幸的是我无法理解它.这些是这样的表的结果:

id  ins-date
3   2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
Run Code Online (Sandbox Code Playgroud)

sql-server triggers recursive-query sql-cte

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

SQLAlchemy简单递归cte查询

我有以下 SQLAlchemy 表:

\n\n\n\n
from sqlalchemy.ext.declarative import declarative_base\n\nBase = declarative_base()\n\nclass NetworkLink(Base):\n    """Network immediate link between a franchisee and his franchisor\n\n    """\n    __tablename__ = \'network_link\'\n\n    id_franchisee = Column(Integer, ForeignKey(\'user.id\'), primary_key=True)\n    id_franchisor = Column(Integer, ForeignKey(\'user.id\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

它基本上代表了一个树状的网络结构。

\n\n

给定特许人的 id,我需要获取整个子树中所有后代的 id。\n例如,如果表如下:

\n\n
id_franchisor | id_franchisee \n1 | 2\n1 | 3\n2 | 4\n2 | 5\n4 | 6\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后给定 id 1 我需要 1,2,3,4,5,6,而给定 2 我需要 2,4,5,6。

\n\n

我知道这不是解决此问题的最有效的表表示形式,但此操作将很少执行,并且插入将更加常见。

\n\n

我正在尝试使用递归查询来实现此功能,如下所示:

\n\n
"""\nWITH RECURSIVE recursive_franchisee(id) AS\n(\n    SELECT %s\n    UNION ALL\n    SELECT L.id_franchisee\n    FROM recursive_franchisee …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy recursive-query common-table-expression

6
推荐指数
0
解决办法
8708
查看次数

MySQL-递归列出表中所有项目的所有父项和祖先

我有一个带有父/子层次结构的表,支持多个(理论上无限)级别的嵌套:

|------|-------------------|-------------|
|  id  |       title       |  parent_id  |
|------|-------------------|-------------|
|  1   |    Dashboard      |      0      |
|  2   |    Content        |      0      |
|  3   |    Modules        |      0      |
|  17  |    User Modules   |      3      |
|  31  |    Categories     |      17     |
|  ... |                   |             |
|------|-------------------|-------------|
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建一个查询,生成每个项目的父项的串联列表,直到树中的最高父项:

|------|----------------------|
|  id  | concatenatedParents  |
|------|----------------------|
|  1   |  0                   |
|  2   |  0                   |
|  3   |  0                   |
|  17  |  3,0                 | …
Run Code Online (Sandbox Code Playgroud)

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

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