我有一个递归 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) 我有一组具有唯一节点的连接边。它们使用父节点连接。考虑以下示例代码和插图:
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
我按照图表设计了我的数据库。
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)
基本上应该会产生这样的结果。
我正在尝试弄清楚如何对分层表使用递归查询。我需要获取给定记录的祖先,并且记录应该按照它们在层次结构中的级别进行排序。也就是说,第一个记录应该是顶部节点,下一个应该是一个子节点,然后是它的子节点,直到被查询的记录。
考虑一个名为“食物”的表,其中包含以下数据。这是一个简单的层次结构,除了顶部记录之外的每条记录都有一个父记录。
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)
如何构建该查询以按我想要的顺序提供记录?
对于带有自引用外键的表:
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) 我在 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
我希望根据另一个设置的值将许多重复行插入表中 - 想法和建议将不胜感激。
tblType
Type Qty
Apple 2
Banana 1
Mango 3
tblResult
Apple
Apple
Banana
Mango
Mango
Mango
Run Code Online (Sandbox Code Playgroud) 我有一个名为的表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 列拆分为一个空格来实现这一点 - 我尝试了不同的方法,包括此处概述的方法:
我知道有一种方法可以使用 …
我正在尝试做一个查询,我不确定是否有可能我有一个名为句子的表,其中包含 ID、句子和验证,如下图所示。
我有另一个表,称为字数统计,其中包含 ID、单词和频率。所以我希望当一个句子输入更新或删除时,该表相应地更新或每天更新,因为可能有很多句子
我的预期输出类似于下图。
任何想法都是可行的,任何人都可以帮忙。
我正在尝试从远程表中获取数据。使用递归 CTE 从本地表中的种子数据集扩展数据。查询非常慢(300 个种子行到 800 个最终行需要 7 分钟)。
对于其他“微小的本地,巨大的远程” -没有递归查询的情况,DRIVING_SITE提示效果很好。我还尝试将种子集从本地表导出到remotedb具有相同结构的辅助表中,并且 - 已登录remotedb- 作为纯本地查询(my_tableas p,my_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.* 在主要选择 …recursive-query ×10
sql ×6
postgresql ×3
sql-server ×2
sqlite ×2
aggregate ×1
mysql ×1
oracle ×1
oracle11g ×1
string ×1