标签: recursive

连接后保留数组元素的顺序

我有一个返回 CTE 的查询,如下所示

+-----------+-------------+
|   node_id | ancestors   |
|-----------+-------------|
|         1 | []          |
|         2 | []          |
|         3 | [1]         |
|         4 | [2]         |
|         5 | [4, 2]      |
+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

我想要做的是加入表nodes并将该列中的 id 替换ancestors为表中的另一列nodes。这是我到目前为止的查询:

WITH RECURSIVE tree AS (
  -- snip --
)
SELECT node.entity_id AS id,
       array_remove(array_agg(parent_nodes.entity_id), NULL) AS ancestors
FROM tree
JOIN entity.nodes AS node ON node.id = tree.node_id
LEFT OUTER JOIN entity.nodes AS parent_nodes ON …
Run Code Online (Sandbox Code Playgroud)

postgresql cte array recursive

4
推荐指数
1
解决办法
2073
查看次数

生成字符串列表的所有组合

我正在尝试生成 Strings 列表的所有组合 list = ['A', 'B', 'C', 'D']

我想生成所有可能性,然后在数据库中搜索

ABCD, ABC, ABD, ACD, BCD, AB, AC, AD, BC, BD, CD, A, B, C, D

我的专栏是这样的:

结果 代码
1 A
2 公元前
3 交流电
4
5 ABC
6 广告
7 BCD
8 光盘
9 A B C D
10 阿布德
………… ......

澄清一下:顺序并不重要(ABC = BAC = CAB),它应该返回多个结果(对于 list = ['A', 'B', 'C'] 与上面的 10 列相同,它应该返回 [1 、2、3、4、5])。

我正在使用 Postgres,并且尝试过一些我见过的递归函数,但没有一个能够完全满足我的需求。

postgresql recursive

4
推荐指数
1
解决办法
1608
查看次数

PostgreSQL:从当前余额向后计算余额

我有一张balances表,current_balance用于存储银行账户;以及一个transfers表格,其中包含每次转账到账户和从账户转账的行(存款为正数,取款为负数)。

我需要创建一个帐户摘要,其中包含帐户的每次转账,以及该转账产生的余额。

例子:

+--------------------------+--------+---------+
|      activity_date       | amount | balance |
+--------------------------+--------+---------+
| 2015-12-24T20:27:00.670Z |     10 |     180 |
| 2015-12-19T12:13:50.085Z |   -275 |     170 |
| 2015-12-18T23:56:22.513Z |     10 |     445 |
| 2015-12-18T23:54:46.880Z |     50 |     435 |
| 2015-12-17T03:32:10.707Z |   -120 |     385 |
| 2015-12-12T03:56:50.775Z |     35 |     505 |
| 2015-12-11T23:09:40.211Z |    -20 |     470 |
| 2015-12-03T01:17:59.460Z |    -10 |     490 |
| 2015-11-23T15:39:35.003Z |    500 |     500 …
Run Code Online (Sandbox Code Playgroud)

postgresql recursive

3
推荐指数
1
解决办法
1707
查看次数

MySQL中递归获取最高父id

我想找到每个条目最上面的父 ID。例如,

CREATE TABLE t1
(
ID int(11) unsigned NOT NULL,
ParentID int(11) unsigned,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

INSERT INTO t1 (ID,ParentID) VALUES (1,NULL),(2,1),(3,2),(4,3);
Run Code Online (Sandbox Code Playgroud)

我意图得到

ID     Highest ParentID
1      NULL
2      1
3      1
4      1
Run Code Online (Sandbox Code Playgroud)

我计划创建一个递归查询(MySQL 8 或 MariaDB 10.5),方法是添加一个条件,以在 Parent ID 为特定值(例如,上述情况下为 NULL)时中断递归。我开始于

WITH RECURSIVE cte (ID, ParentID) as (
  SELECT ID,ParentID FROM t1
  UNION ALL
  SELECT t2.ID,t2.ParentID FROM t1 t2
  INNER JOIN cte on t2.ParentID = cte.ID
)
SELECT * FROM cte; …
Run Code Online (Sandbox Code Playgroud)

mysql join query recursive

3
推荐指数
1
解决办法
6837
查看次数

T-SQL CTE 比较前一个非空行和当前行以按差值过滤掉

我的示例数据库(实际上是 CTE 语句数据)如下所示:

eventdate   val
2012-03-23  3965
2012-03-26  3979
2012-03-27  3974
2012-03-28  3965
2012-03-29  3967
2012-03-30  3959
2012-04-02  3951
2012-04-03  3961
2012-04-04  3944
2012-04-05  3935
2012-04-09  3901
2012-04-10  3822
Run Code Online (Sandbox Code Playgroud)

我想删除差异小于 12 的值。这是我的查询和输出:

SELECT
eventdate,
CASE
WHEN ABS(val - LAG(val) OVER (ORDER BY eventdate)) <= 12
THEN NULL
ELSE val
END AS val
FROM tbl_1
ORDER BY eventdate
Run Code Online (Sandbox Code Playgroud)

输出:

eventdate   val
2012-03-23  3965
2012-03-26  3979
2012-03-27  NULL
2012-03-28  NULL
2012-03-29  NULL
2012-03-30  NULL
2012-04-02  NULL
2012-04-03  NULL
2012-04-04  3944
2012-04-05  NULL …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql cursors recursive

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

在递归 CTE 中计算父级的子级

我使用此查询来查找父母的评论id

WITH RECURSIVE cte (id, content, path, parent_id, depth)  AS (
    SELECT  id,
        content,
        array[id] AS path,
        parent_id,
        1 AS depth
    FROM    comment
    WHERE   id = 1

    UNION ALL

    SELECT  comment.id,
        comment.content,
        cte.path || comment.id,
        comment.parent_id,
        cte.depth + 1 AS depth
    FROM    comment
    JOIN cte ON comment.parent_id = cte.id
    WHERE depth < 3
    )
    SELECT id, content, path, parent_id, depth FROM cte
ORDER BY path LIMIT 200;
Run Code Online (Sandbox Code Playgroud)

除了我将深度限制为 3 之外,它运行良好。我怎样才能知道当前行是否有更多的孩子,如果有,请获取它们的数量,以便我可以显示数字,例如。“多加载 X”。

解决这个问题的最佳方法是什么?

这个小提琴中id4 和 …

postgresql cte recursive

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

选择层次结构中的所有子级

我有一个像这样的分层数据表:

BookGroupID  GroupName  ParentGroupID
-----------  ---------  -------------
0            Primary    0
1            abc        0
2            abd        0
3            abe        0
4            cbc        1
5            ceg        2
6            cjd        3
7            hjd        5
8            bjy        5
9            mfs        4
10           ikl        7
11           hjy        8
12           mnf        5
13           aws        10
14           qws        11
15           aqe        13
Run Code Online (Sandbox Code Playgroud)

我想在层次结构中选择一个特定的 BookGroupID 及其所有直接和间接子级。例如,对于 2 的 BookGroupID,输出应如下所示:

BookGroupID
-----------
2
5
7
8
10
11
12
13
14
15
Run Code Online (Sandbox Code Playgroud)

解释一下,第 5 行在输出中,因为它是第 2 行的直接孩子,第 7、8 和 …

sql-server-2005 sql-server recursive

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

如何使用 PostgreSQL 更改层次结构树中的字符串输出?

我有一张这样的表:

-------------------------------------------------
|  id  | description         | parent_id   |  cost
--------------------------------------------------
| 1    |  Radiology         |       NULL  | 0.00
| 2    |  Lab Tests         |       NULL  | 0.00
| 3    |  Normal Radiology  |         1   | 0.00
| 4    |  Resonance         |         1   | 100.00
| 1100 |  Cerebral Resonance|         4   | 200.00
| 1900 |  Blood Tests       |         2   | 10.00
| 2044 |  Calcium           |         2   | 50.00

---------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我需要生成这种输出:

Radiology
   -->Normal Radiology
   -->Resonance
      -->Cerebral Resonance with contrast …
Run Code Online (Sandbox Code Playgroud)

postgresql cte recursive string-manipulation

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

为什么我的非空列在我的 CTE 递归查询中变得可以为空?

我有一个简单的分层表。假设它有这些列:

Id, [Guid], ParentId, Title
Run Code Online (Sandbox Code Playgroud)

只有可以ParentId为空。其他列不可为空。

我创建了一个递归查询来显示从节点到根的路径。为此,我使用了 CTE。这是我的查询:

with Anchor (Id, [Guid], ParentId, Title, [Path])
as
(
    select Id, [Guid], ParentId, Title, cast('' as nvarchar(100)) as [Path]
    from Hierarchies
    where ParentId is null
    union all
    select Hierarchies.Id, Hierarchies.[Guid], Hierarchies.ParentId, Hierarchies.Title, cast(Anchor.[Path] + '/' + Hierarchies.Title as nvarchar(100)) as [Path]
    from Hierarchies
    inner join Anchor
    on Hierarchies.ParentId = Anchor.Id
)
select 
    isnull(Anchor.Id, 0) as Id,
    isnull(Anchor.[Guid], newid()) as [Guid],
    Anchor.ParentId,
    Anchor.Title,
    Anchor.[Path]
from Anchor
Run Code Online (Sandbox Code Playgroud)

问题是,当我将此查询转换为视图时,该Guid列变为可以为空。我什至使用isnull()函数来强制它不为空。令我惊讶的是,这 …

null sql-server cte recursive

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

PostgreSQL中的递归CTE生成不同频率的数据

我正在尝试编写一个在 Postgresql 14 中使用递归 CTE 的数据生成查询。

考虑包含函数 getfreq 的模式“sc”。getfreq 将 int 作为参数(代表另一个表的外键),并返回 int,代表频率。

现在考虑这个查询:

WITH RECURSIVE rec AS 
(
SELECT 1 as fk FROM generate_series(1, sc.getfreq(1), 1)
UNION ALL
SELECT r.fk + 1 FROM rec AS r WHERE r.fk + 1 <= 10
)
select row_number() OVER () as pk, fk from rec
Run Code Online (Sandbox Code Playgroud)

getfreq 期望一个从 1 到 10 的 int(因此 r.fk <= 10 退出条件)。它返回频率 N。我希望递归 CTE 的每次迭代都创建 N 行。每次迭代的结果将通过 UNION ALL 子句组合在一起。最后,我想要一个结果,其中行数等于 getfreq 在 10 次迭代中返回的频率之和。

在上面的示例中,sc.getfreq(1) 将始终返回 5,因此我得到 50 …

postgresql cte recursive

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

从孩子ID中获取所有父母

我创建了一个名为“ vegs ”的表,并像这样插入了值。

    id  name            parent
--------------------------------------
    1   fruits          0
    2   Apple           1
    3   Orange          1
    4   Grape           1
    5   Green Apple     2
    6   Red Apple       2
Run Code Online (Sandbox Code Playgroud)

我想递归获取孩子“ 6 ”的所有父母。

mysql recursive

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

递归外键的排除约束(以树为例)

我有带有递归外键的表。它只是层次树结构:

CREATE TABLE tree (
    id              INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    value           INTEGER NOT NULL,
    tree_id         SMALLINT NOT NULL CHECK (tree_id > CAST(0 AS SMALLINT)),
    parent_id       INTEGER REFERENCES tree ON DELETE RESTRICT ON UPDATE RESTRICT,

    EXCLUDE (tree_id WITH =) WHERE (parent_id IS NULL) -- allow only one root within tree
);
Run Code Online (Sandbox Code Playgroud)

如何拒绝插入非空parent_id和不同的记录tree_id?即外键parent_id只能引用id同一个内的主键tree_id

postgresql tree foreign-key constraint recursive

0
推荐指数
1
解决办法
221
查看次数