标签: self-join

递归 CTE 中的自联接:`递归引用不能出现多次`?

这是用 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)

postgresql recursive postgresql-9.6 self-join

6
推荐指数
2
解决办法
1494
查看次数

联机丛书中的自加入示例评论

在此处输入图片说明 在此示例中,它声明执行self-join,但它连接Sales.SalesPersonSales.SalesTerritory。我知道自连接意味着将同一张表连接到自己,但这里不是Sales.SalesPersonSales.SalesTerritory不同的表?那么,尽管表不同,这是否被认为是自连接?还是有错误?

来源链接

sql-server t-sql self-join

6
推荐指数
1
解决办法
310
查看次数

是否可以在 PostgreSQL 中使用单个语句更新插入到自引用表中?

如果我有一张桌子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 upsert self-join

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

通过自连接表递归获取树

使用此处的其他问题和 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)

postgresql recursive many-to-many self-join

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

避免自连接重复

给出下表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 中解决这个问题?

mysql query self-join

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