标签: recursive-query

如何创建MySQL分层递归查询

我有一个MySQL表,如下所示:

id | name        | parent_id
19 | category1   | 0
20 | category2   | 19
21 | category3   | 20
22 | category4   | 21
......
Run Code Online (Sandbox Code Playgroud)

现在,我想要一个MySQL查询,我只提供id [例如说'id = 19']然后我应该得到它的所有子id [即结果应该有id',21,22']. ...而且,孩子们的等级不知道它可以变化....

另外,我已经有了使用for循环的解决方案.....如果可能的话,让我知道如何使用单个MySQL查询来实现相同的功能.

mysql sql recursive-query hierarchical-data

237
推荐指数
9
解决办法
25万
查看次数

如何在MySQL中进行递归SELECT查询?

我有一张桌子:

col1 | col2 | col3
-----+------+-------
1    | a    | 5
5    | d    | 3
3    | k    | 7
6    | o    | 2
2    | 0    | 8
Run Code Online (Sandbox Code Playgroud)

如果用户搜索"1",程序将查看col1具有"1"的程序,然后它将获得col3"5"中的值,然后程序将继续搜索"5",col1并且将获得"3" in col3等等.所以它会打印出来:

1   | a   | 5
5   | d   | 3
3   | k   | 7
Run Code Online (Sandbox Code Playgroud)

如果用户搜索"6",它将打印出来:

6   | o   | 2
2   | 0   | 8
Run Code Online (Sandbox Code Playgroud)

如何构建SELECT查询来做到这一点?

mysql sql query-optimization recursive-query

79
推荐指数
5
解决办法
10万
查看次数

是否可以进行递归SQL查询?

我有一个类似于这样的表:

CREATE TABLE example (
  id integer primary key,
  name char(200),
  parentid integer,
  value integer);
Run Code Online (Sandbox Code Playgroud)

我可以使用parentid字段将数据排列到树结构中.

现在这是我无法解决的问题.给定一个parentid,是否可以编写一个SQL语句来添加该parentid下的所有值字段并递归树的分支?

更新:我正在使用posgreSQL,因此我无法使用奇特的MS-SQL功能.无论如何,我希望将其视为一般SQL问题.

顺便说一下,在提出问题的15分钟内得到6个答案给我留下了非常深刻的印象!去堆栈溢出!

sql postgresql recursive-query

62
推荐指数
7
解决办法
6万
查看次数

递归CTE如何逐行运行?

我认为我已经将Recursive CTE的格式写得很好,但是仍然发现自己很沮丧,我无法手动处理一个(假装自己是SQL引擎并用笔和纸到达结果集) .我发现了这个,这接近我正在寻找的,但不够详细.我没有问题跟踪C++递归函数并了解它是如何运行的 - 但对于SQL我不明白为什么或如何引擎知道停止.每次调用锚点和递归块,还是在以后的迭代中跳过锚点?(我对此表示怀疑,但我试图表达我对它似乎跳转的方式的困惑.)如果每次调用锚点,锚点在最终结果中不会多次出现?我希望有人能够分解第1行第2行等等.结果集累积时会发生什么以及"在内存中".

我冒昧地从这个页面窃取我的例子,因为它似乎是最容易理解的.

DECLARE @tbl TABLE ( 
      Id INT 
    , [Name] VARCHAR(20) 
    , ParentId INT 
) 

INSERT INTO @tbl( Id, Name, ParentId ) 
VALUES 
     (1, 'Europe', NULL) 
    ,(2, 'Asia',   NULL) 
    ,(3, 'Germany',   1) 
    ,(4, 'UK',        1) 
    ,(5, 'China',     2) 
    ,(6, 'India',     2) 
    ,(7, 'Scotland',  4) 
    ,(8, 'Edinburgh', 7) 
    ,(9, 'Leith',     8)  
; 

WITH abcd 
    AS ( 
        -- anchor 
        SELECT  id, Name, ParentID, 
                CAST(Name AS VARCHAR(1000)) AS Path 
        FROM    @tbl 
        WHERE   ParentId …
Run Code Online (Sandbox Code Playgroud)

sql recursive-query

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

单个查询中的多个CTE

是否可以在单个查询中组合多个CTE arel?我正在寻找获得这样结果的方法:

WITH 'cte1' AS (
...
),
WITH RECURSIVE 'cte2' AS (
...
),
WITH 'cte3' AS (
...
)
SELECT ... FROM 'cte3' WHERE ...
Run Code Online (Sandbox Code Playgroud)

如你所见,我有一个递归CTE和两个非递归.

sql postgresql recursive-query common-table-expression arel

38
推荐指数
3
解决办法
3万
查看次数

使用Query递归查找Parent

我正在使用postgresql.我有如下表格

parent_id    child_id
----------------------
101       102
103       104
104       105
105       106   
Run Code Online (Sandbox Code Playgroud)

我想编写一个sql查询,它将给出输入的最终父级.

即假设我传递106作为输入,那么它的输出将是103.

(106 --> 105 --> 104 --> 103)
Run Code Online (Sandbox Code Playgroud)

postgresql recursive-query

29
推荐指数
2
解决办法
2万
查看次数

Django自我递归外键过滤查询所有孩子

我有这个模型与自引用外键关系:

class Person(TimeStampedModel):
    name = models.CharField(max_length=32)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
Run Code Online (Sandbox Code Playgroud)

现在我想为一个人获得所有多层次的孩子.我该如何为它编写Django查询?它需要表现得像递归函数.

django model recursive-query

24
推荐指数
4
解决办法
2万
查看次数

如何选择使用WITH RECURSIVE子句

我已经谷歌搜索并阅读了一些像 这个postgreSQL手册页这个博客页面的文章, 并尝试自己成功地进行查询(其中一部分挂起,而其他人工作良好和快速),但到目前为止,我无法完全理解这是怎么回事魔术作品.

任何人都可以给出非常明确的解释来证明这样的查询语义和执行过程,更好地基于典型的样本,如因子计算或从(id,parent_id,name)表中完全树扩展?

什么是基本的指导和常见的错误,人们应该知道如何做出好的with recursive疑问?

sql postgresql recursive-query

21
推荐指数
1
解决办法
2万
查看次数

Oracle SYS_CONNECT_BY_PATH等效查询到SQL Server

我正在尝试将涉及Oracle SYS_CONNECT_BY_PATH语法的复杂查询转换为SQL Server:

    SELECT 
           DISTINCT TO_CHAR(CONCAT(@ROOT, SYS_CONNECT_BY_PATH(CONCAT('C_',X), '.'))) AS X_ALIAS
                , TO_CHAR(CONCAT(@ROOT, PRIOR SYS_CONNECT_BY_PATH(CONCAT('C_',X), '.'))) AS X_ALIAS_FATHER
                , TO_CHAR(X) AS X_ALIAS_LEAF
                , LEVEL AS LVL
      FROM MY_TABLE
 LEFT JOIN MY_TABLE_BIS MY_TABLE_BIS_ALIAS ON MY_TABLE_BIS_ALIAS.MY_ID = COL_X
 LEFT JOIN OTHER_TABLE 
        ON OTHER_TABLE.MY_ID = COL_X
CONNECT BY (PRIOR ID_SON = ID_FATHER)
       AND LEVEL <= MAXDEPTH
START WITH ID_FATHER 
        IN (SELECT AN_ID AS ID_FATHER FROM BIG_TABLE)
Run Code Online (Sandbox Code Playgroud)

这是我使用本网站获得的

WITH n(LEVEL, X_ALIAS, X_ALIAS_FATHER, X_ALIAS_LEAF) AS
      ( SELECT 1, CONCAT('C_',X), CONCAT('C_',X), CAST(X AS VARCHAR(30))
          FROM …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server recursive-query hierarchical-data

20
推荐指数
1
解决办法
1078
查看次数

错误 - 使用CTE进行递归选择时,"UNION运算符必须具有相同数量的表达式"

这时我有一张tblLocation带有柱子的桌子ID, Location, PartOfID.

该表以递归方式连接到自身: PartOfID -> ID

我的目标是选择输出如下:

> France > Paris > AnyCity >
Run Code Online (Sandbox Code Playgroud)

说明:AnyCity位于巴黎,巴黎位于法国.

我到现在为止找到的解决方案是这样的:

; with q as (
select ID,Location,PartOf_LOC_id from tblLocatie t
where t.ID = 1 -- 1 represents an example
union all
select t.Location + '>' from tblLocation t
inner join q parent on parent.ID = t.LOC_PartOf_ID
)
select * from q
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到以下错误:

使用UNION,INTERSECT或EXCEPT运算符组合的所有查询在其目标列表中必须具有相同数量的表达式.

如果您知道如何修复我的输出,那就太棒了.

sql t-sql sql-server recursive-query

17
推荐指数
1
解决办法
10万
查看次数