标签: recursive-query

SQL 递归 CTE:通过多个递归引用防止递归循环

我有一个递归 CTE 查询,但是在创建循环时它失败了。我已经修复了简单的循环(例如 1 -> 2 -> 1),但无法修复更复杂的循环(例如 1 -> 2 -> 3 -> 2)。

查询详情

测试表有两列:Base 和Parent。我想要一个所有祖先的列表。

如果您从 test2 开始,我的查询适用于下面的示例数据,但在您从 test1 开始时则无效。

样本数据

Base    Parent
----    ------
test1   test2
test2   test3
test3   test2
Run Code Online (Sandbox Code Playgroud)

SQL 查询(我尝试的修复已在注释中标记)

;with sample_data (Base, Parent) as (
    select 'test1', 'test2'
    union select 'test2', 'test3'
    union select 'test3', 'test2'
),
nt_list (Base, Ancestor, [level]) as (
        select  Base,
                Parent Ancestor,
                1 [level]
        from    sample_data
        where   Base = 'test1' -- START HERE
        union all
        select  ntl.Base, …
Run Code Online (Sandbox Code Playgroud)

sql recursive-query common-table-expression

5
推荐指数
1
解决办法
6451
查看次数

聚合连接的节点/边集

我有一组具有唯一节点的连接边。它们使用父节点连接。考虑以下示例代码和插图:

CREATE TABLE network (
  node integer PRIMARY KEY,
  parent integer REFERENCES network(node),
  length numeric NOT NULL
);
CREATE INDEX ON network (parent);
INSERT INTO network (node, parent, length) VALUES
  (1, NULL, 1.3),
  (2, 1, 1.2),
  (3, 2, 0.9),
  (4, 3, 1.4),
  (5, 4, 1.6),
  (6, 2, 1.5),
  (7, NULL, 1.0);
Run Code Online (Sandbox Code Playgroud)

连通集

在视觉上,可以识别两组边缘。如何使用 PostgreSQL 9.1 识别这两个组并length求和?预期结果显示:

结果

 edges_in_group | total_edges | total_length
----------------+-------------+--------------
 {1,2,3,4,5,6}  |           6 |          7.9
 {7}            |           1 |          1.0
(2 rows)
Run Code Online (Sandbox Code Playgroud)

我什至不知道从哪里开始。我需要自定义聚合或窗口函数吗?我可以WITH RECURSIVE用来迭代收集连接的边吗?我的真实案例是一个有 245,000 …

postgresql aggregate recursive-query common-table-expression window-functions

5
推荐指数
1
解决办法
571
查看次数

SQL Server 列的层次总和

我按照图表设计了我的数据库。

在此处输入图片说明

  • Category 表是自引用父子关系
  • Budget 将为每个类别定义所有类别和数量
  • Expense表将包含已花费金额的类别条目(考虑Total此表中的列)。

我想编写 select 语句来检索具有下面给出的列的数据集:

ID   
CategoryID   
CategoryName   
TotalAmount (Sum of Amount Column of all children hierarchy From BudgetTable  )   
SumOfExpense (Sum of Total Column of Expense  all children hierarchy from expense table)
Run Code Online (Sandbox Code Playgroud)

我尝试使用 CTE,但无法产生任何有用的东西。提前感谢您的帮助。:)

更新

我只是为了组合和简化数据,我用下面的查询创建了一个视图。

SELECT        
    dbo.Budget.Id, dbo.Budget.ProjectId, dbo.Budget.CategoryId, 
    dbo.Budget.Amount, 
    dbo.Category.ParentID, dbo.Category.Name, 
    ISNULL(dbo.Expense.Total, 0) AS CostToDate
FROM
    dbo.Budget 
INNER JOIN
    dbo.Category ON dbo.Budget.CategoryId = dbo.Category.Id 
LEFT OUTER JOIN
    dbo.Expense ON dbo.Category.Id = dbo.Expense.CategoryId
Run Code Online (Sandbox Code Playgroud)

基本上应该会产生这样的结果。

在此处输入图片说明

sql-server recursive-query hierarchical-data

5
推荐指数
1
解决办法
2910
查看次数

sqlite递归祖先查询

我正在尝试弄清楚如何对分层表使用递归查询。我需要获取给定记录的祖先,并且记录应该按照它们在层次结构中的级别进行排序。也就是说,第一个记录应该是顶部节点,下一个应该是一个子节点,然后是它的子节点,直到被查询的记录。

考虑一个名为“食物”的表,其中包含以下数据。这是一个简单的层次结构,除了顶部记录之外的每条记录都有一个父记录。

id         | parent
-----------+---------
top        |
fruit      | top
red        | fruit
cherry     | red
apple      | red
orange     | fruit
clementine | orange
mandarin   | orange
Run Code Online (Sandbox Code Playgroud)

为了了解有关该主题的各种网页,我拼凑了以下查询,该查询给出了“普通话”记录的所有祖先,包括普通话记录本身。

with recursive
    child_record(id) as (
        values('mandarin')

        union

        select parent
        from food, child_record
        where food.id = child_record.id
    )
select id from food
    where food.id in child_record;
Run Code Online (Sandbox Code Playgroud)

但是,该查询以在我看来是任意顺序的记录返回:

fruit
mandarin
orange
top
Run Code Online (Sandbox Code Playgroud)

我希望记录首先按最高记录排序,然后再向下排列到普通话记录。

top
fruit
orange
mandarin
Run Code Online (Sandbox Code Playgroud)

如何构建该查询以按我想要的顺序提供记录?

sqlite recursive-query

5
推荐指数
1
解决办法
1394
查看次数

Postgres 中使用自引用外键删除

对于带有自引用外键的表:

CREATE TABLE tree (  
    id INTEGER,
    parent_id INTEGER,
    PRIMARY KEY (id)  
);

ALTER TABLE tree 
   ADD CONSTRAINT fk_tree
   FOREIGN KEY (parent_id) 
   REFERENCES tree(id);

INSERT INTO tree (id, parent_id)
VALUES (1, null),
       (2, 1),
       (3, 1),
       (4, 2),
       (5, null),
       (6, 5);
Run Code Online (Sandbox Code Playgroud)

我希望通过递归遍历树来删除分支,因为我可能不会使用ON DELETE CASCADE.

WITH RECURSIVE branch (id, parent_id) AS (
      SELECT id, parent_id
      FROM tree
      WHERE id = 1 -- Delete branch with root id = 1

      UNION ALL SELECT c.id, c.parent_id
      FROM tree c -- …
Run Code Online (Sandbox Code Playgroud)

sql postgresql recursive-query common-table-expression

5
推荐指数
1
解决办法
2639
查看次数

PostgreSQL with RECURSIVE 查询通过分区键获取有序的父子链

我在 PostgreSQL 9.6.6 上编写 sql 脚本时遇到问题,该脚本通过使用步骤的父子 ID 对进程中的步骤进行排序,并且按进程 ID 进行分组/分区。我在这里找不到这个特殊情况,所以如果我错过了它,我深表歉意,并请您在评论中向我提供解决方案的链接。

案例:我有一张表,如下所示:

processID | stepID | parentID
     1         1          NULL
     1         3           5
     1         2           4
     1         4           3
     1         5           1
     2         1          NULL
     2         3           5
     2         2           4
     2         4           3
     2         5           1
Run Code Online (Sandbox Code Playgroud)

现在,我必须从每个 processID 的 ParentID 为 NULL 的步骤开始对步骤进行排序。

注意:我不能简单地订购 StepID 或 ParentID,因为我在整个过程中放入的新步骤会获得比过程中最后一步更高的步骤 ID(连续生成代理键)。

我必须为每个 processID 订购步骤,我将收到以下输出:

processID | stepID | parentID
     1         1          NULL
     1         5           1
     1         3           5
     1         4           3
     1         2 …
Run Code Online (Sandbox Code Playgroud)

postgresql recursive-query with-statement common-table-expression window-functions

5
推荐指数
1
解决办法
2284
查看次数

SQL - 根据计数插入行

我希望根据另一个设置的值将许多重复行插入表中 - 想法和建议将不胜感激。

tblType
Type     Qty
Apple    2
Banana   1
Mango    3

tblResult
Apple
Apple
Banana
Mango
Mango
Mango
Run Code Online (Sandbox Code Playgroud)

sql sql-server recursive-query

5
推荐指数
1
解决办法
3209
查看次数

拆分空格分隔值并将它们映射到 SQLite 中的原始 ID?

我有一个名为的表personal_websessions,其中包含以下格式的数据:

 id_no | website_link 
 1     | google.com msn.com gmail.com 
 2     | stackoverflow.com reddit.com 
 3     | msn.com 
Run Code Online (Sandbox Code Playgroud)

您可以使用以下 SQL 命令创建此表:

CREATE TABLE personal_websessions(id_no INTEGER PRIMARY KEY, website_link TEXT);
INSERT INTO personal_websessions VALUES(1, 'google.com msn.com gmail.com'), (2, 'stackoverflow.com reddit.com'), (3, 'msn.com ');
Run Code Online (Sandbox Code Playgroud)

我想用空格 ' ' 分割 website_link 列的值以获得下表结果:

id_no | website_link 
1     | google.com
1     | msn.com 
1     | gmail.com
2     | stackoverflow.com
2     | reddit.com
3     | msn.com
Run Code Online (Sandbox Code Playgroud)

我想将 website_link 列拆分为一个空格来实现这一点 - 我尝试了不同的方法,包括此处概述的方法:

但是这个例子并没有多大帮助,因为它是逗号分隔而不是空格分隔

我知道有一种方法可以使用 …

sql sqlite recursive-query

5
推荐指数
1
解决办法
223
查看次数

如何在 sql 中创建查询以将句子切成单词并将它们添加到新表中的频率

我正在尝试做一个查询,我不确定是否有可能我有一个名为句子的表,其中包含 ID、句子和验证,如下图所示。

在此处输入图片说明

我有另一个表,称为字数统计,其中包含 ID、单词和频率。所以我希望当一个句子输入更新或删除时,该表相应地更新或每天更新,因为可能有很多句子

我的预期输出类似于下图。

在此处输入图片说明

任何想法都是可行的,任何人都可以帮忙。

mysql sql string recursive-query

5
推荐指数
1
解决办法
565
查看次数

强制 Oracle 在远程数据库站点上处理递归 CTE(可能使用 DRIVING_SITE 提示)

我正在尝试从远程表中获取数据。使用递归 CTE 从本地表中的种子数据集扩展数据。查询非常慢(300 个种子行到 800 个最终行需要 7 分钟)。

对于其他“微小的本地,巨大的远程” -没有递归查询的情况,DRIVING_SITE提示效果很好。我还尝试将种子集从本地表导出到remotedb具有相同结构的辅助表中,并且 - 已登录remotedb- 作为纯本地查询(my_tableas pmy_table_seed_copyas i)运行查询。花了 4 秒,这鼓励我相信强制查询到远程站点会使查询更快。

强制 Oracle 在远程站点上执行递归查询的正确方法是什么?

with s (id, data) as (
  select p.id, p.data
  from my_table@remotedb p
  where p.id in (select i.id from my_table i)
  union all
  select p.id, p.data
  from s
  join my_table@remotedb p on ...
)
select /*+DRIVING_SITE(p)*/ s.*
from s;
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,我试过

  • select /*+DRIVING_SITE(p)*/ s.* 在主要选择
  • select /*+DRIVING_SITE(s)*/ s.* 在主要选择 …

sql oracle database-link recursive-query oracle11g

5
推荐指数
1
解决办法
96
查看次数