我有一个返回 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) 我正在尝试生成 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,并且尝试过一些我见过的递归函数,但没有一个能够完全满足我的需求。
我有一张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) 我想找到每个条目最上面的父 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) 我的示例数据库(实际上是 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) 我使用此查询来查找父母的评论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 和 …
我有一个像这样的分层数据表:
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 和 …
我有一张这样的表:
-------------------------------------------------
| 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) 我有一个简单的分层表。假设它有这些列:
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()函数来强制它不为空。令我惊讶的是,这 …
我正在尝试编写一个在 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 …
我创建了一个名为“ 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 ”的所有父母。
我有带有递归外键的表。它只是层次树结构:
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。
recursive ×12
postgresql ×7
cte ×5
sql-server ×3
mysql ×2
array ×1
constraint ×1
cursors ×1
foreign-key ×1
join ×1
null ×1
query ×1
t-sql ×1
tree ×1