我有一个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查询来实现相同的功能.
我有一张桌子:
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查询来做到这一点?
我有一个类似于这样的表:
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个答案给我留下了非常深刻的印象!去堆栈溢出!
我认为我已经将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) 是否可以在单个查询中组合多个CTE arel?我正在寻找获得这样结果的方法:
WITH 'cte1' AS (
...
),
WITH RECURSIVE 'cte2' AS (
...
),
WITH 'cte3' AS (
...
)
SELECT ... FROM 'cte3' WHERE ...
Run Code Online (Sandbox Code Playgroud)
如你所见,我有一个递归CTE和两个非递归.
我正在使用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) 我有这个模型与自引用外键关系:
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查询?它需要表现得像递归函数.
我已经谷歌搜索并阅读了一些像 这个postgreSQL手册页 或这个博客页面的文章, 并尝试自己成功地进行查询(其中一部分挂起,而其他人工作良好和快速),但到目前为止,我无法完全理解这是怎么回事魔术作品.
任何人都可以给出非常明确的解释来证明这样的查询语义和执行过程,更好地基于典型的样本,如因子计算或从(id,parent_id,name)表中完全树扩展?
什么是基本的指导和常见的错误,人们应该知道如何做出好的with recursive疑问?
我正在尝试将涉及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) 这时我有一张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运算符组合的所有查询在其目标列表中必须具有相同数量的表达式.
如果您知道如何修复我的输出,那就太棒了.
recursive-query ×10
sql ×7
postgresql ×4
mysql ×2
sql-server ×2
t-sql ×2
arel ×1
django ×1
model ×1