这是用 PostgreSQL 9.6 测试过的,但这是一个通用的 SQL 问题。
是否可以在递归 CTE (rCTE) 中使用递归表的自联接?
我尝试了以下包含递归项自联接的 rCTE x
,
WITH RECURSIVE
x (id) AS (
SELECT 1 id UNION ALL SELECT x1.id+x2.id FROM x x1, x x2
WHERE x1.id < 5 AND x2.id < 5 AND x1.id = x2.id
)
SELECT * FROM x;
Run Code Online (Sandbox Code Playgroud)
,希望应该等同于:
WITH RECURSIVE
x (id) AS (
SELECT 1 id UNION ALL SELECT id+id FROM x WHERE id < 5
)
SELECT * FROM x;
Run Code Online (Sandbox Code Playgroud)
但是之前的 rCTE 会产生一个错误:
ERROR: recursive reference …
Run Code Online (Sandbox Code Playgroud) 如果我有一张桌子A
,就像这样:
A {
id SERIAL
title TEXT
...
parentId INT references A.id via a foreign key constraint
}
Run Code Online (Sandbox Code Playgroud)
我正在从源表中提取数据 - A_SOURCE
- 没有parentId
列的地方。取而代之的是一parentTitle
列。所以源表看起来像这样:
A_SOURCE {
title TEXT
parentTitle TEXT
}
Run Code Online (Sandbox Code Playgroud)
我开始编写一个 upsert 语句以A
通过从表中选择插入到表中,A_SOURCE
然后才意识到我无法轻松地parentTitle
将源中的列解析parentId
为目标中的 a。
由于我无法确定在处理子项时是否已插入父项,因此连接或子查询可能不会返回任何结果。
我的 upsert 语句看起来像这样:
with source as (
select
title
parentTitle
from A_SOURCE
)
insert into A
select
title
... I don't think I can resolve to parentId here?
from source
on …
Run Code Online (Sandbox Code Playgroud) 使用此处的其他问题和 Postgresql 文档,我设法构建了一个多对多自联接表。
但是添加一个WHERE
条款给我带来了麻烦。
问题:
ACategory
可以有许多子类别和许多父类别。给定 a category.Id
,我想检索类别、类别儿童、儿童的儿童等。
示例:给定这个结构:
child_1
child_11
child_111
child_112
child_1121
child_21
child_2
Run Code Online (Sandbox Code Playgroud)
给定:一个子句 id = child_11
预期结果:
child_11, child_111, child_112, child_1121
,
实际结果: child_11, child_111, child_112
这是我的尝试:http : //sqlfiddle.com/#!17/3640f/2
如果 Sqlfiddle 关闭:https ://www.db-fiddle.com/#&togetherjs=LhDjxfPHo6
注意:我不在乎复制 where 子句,我的应用程序可以处理
表结构:
CREATE TABLE Category(id SERIAL PRIMARY KEY, name VARCHAR(255));
CREATE TABLE Categories(parent_id INTEGER, child_id INTEGER, PRIMARY KEY(parent_id, child_id));
ALTER TABLE Categories ADD FOREIGN KEY (parent_id) REFERENCES category (id);
ALTER TABLE Categories ADD …
Run Code Online (Sandbox Code Playgroud) 给出下表my_table:
my_column
------
A
B
C
D
Run Code Online (Sandbox Code Playgroud)
我希望能够加入自身,但没有重复的对,如下所示:
-- SELECT a.*, b.* FROM my_table a JOIN my_table b ON a.my_column <> b.my_column;
-- something like so but without the duplicate pairs
a.my_column | b.my_column
------------+-----------
A | B
A | C
A | D
B | C
B | D
C | D
Run Code Online (Sandbox Code Playgroud)
我应该如何在 SQL 中解决这个问题?
self-join ×5
postgresql ×3
recursive ×2
many-to-many ×1
mysql ×1
query ×1
sql-server ×1
t-sql ×1
upsert ×1