为 MariaDB 的分层查询实现递归 CTE
Implement Recursive CTE for Hierarchical Query to MariaDB
我有这个table,我想存储一个记录链。
CREATE TABLE table_name (
id INT,
unique_id varchar,
reference_id varchar,
);
我想为 MariDB 实现 SQL 查询,它打印 unique_id 的所有记录和所有记录 reference_id。像这样:
| id | unique_id | reference_id | | |
|----|-----------|--------------|---|---|
| 43 | 55544 | | | |
| 45 | 45454 | 43 | | |
| 66 | 55655 | 45 | | |
| 78 | 88877 | 66 | | |
| 99 | 454 | 33 | | |
我想当我 select 记录 55544 时获取所有交易,因为彼此都在使用指向它们的 id。我如何使用递归 CTE 实现它?有没有更好的方法?
unique_id 55544 记录的预期结果:
| id | unique_id | reference_id | | |
|----|-----------|--------------|---|---|
| 43 | 55544 | | | |
| 45 | 45454 | 43 | | |
| 66 | 55655 | 45 | | |
| 78 | 88877 | 66 | | |
如何在 HQL 中也实现此查询?我想在 JPA 中使用它?
以下查询应该符合您的预期。这是一个递归查询,它依赖于一个变量来通过依赖树跟踪父子关系。
select @ref:=id as id, unique_id, reference_id
from mytable
join (select @ref:=id from mytable WHERE unique_id = 55544)tmp
where reference_id=@ref
这demo on DB Fiddle 产生:
| id | unique_id | reference_id |
| --- | --------- | ------------ |
| 45 | 45454 | 43 |
| 66 | 55655 | 45 |
| 78 | 88877 | 66 |
PS :请注意,这不是 return 最上面的父行。如果您也需要它,可以将 WHERE
条件更改为 :
where reference_id=@ref or unique_id = 55544
您可以使用递归 CTE。这是执行此操作的正确方法:
with recursive cte as (
select t.*
from table_name t
where t.unique_id = 55544
union all
select t.*
from cte join
table_name t
on cte.id = t.reference_id
)
select *
from cte;
我有这个table,我想存储一个记录链。
CREATE TABLE table_name (
id INT,
unique_id varchar,
reference_id varchar,
);
我想为 MariDB 实现 SQL 查询,它打印 unique_id 的所有记录和所有记录 reference_id。像这样:
| id | unique_id | reference_id | | |
|----|-----------|--------------|---|---|
| 43 | 55544 | | | |
| 45 | 45454 | 43 | | |
| 66 | 55655 | 45 | | |
| 78 | 88877 | 66 | | |
| 99 | 454 | 33 | | |
我想当我 select 记录 55544 时获取所有交易,因为彼此都在使用指向它们的 id。我如何使用递归 CTE 实现它?有没有更好的方法?
unique_id 55544 记录的预期结果:
| id | unique_id | reference_id | | |
|----|-----------|--------------|---|---|
| 43 | 55544 | | | |
| 45 | 45454 | 43 | | |
| 66 | 55655 | 45 | | |
| 78 | 88877 | 66 | | |
如何在 HQL 中也实现此查询?我想在 JPA 中使用它?
以下查询应该符合您的预期。这是一个递归查询,它依赖于一个变量来通过依赖树跟踪父子关系。
select @ref:=id as id, unique_id, reference_id
from mytable
join (select @ref:=id from mytable WHERE unique_id = 55544)tmp
where reference_id=@ref
这demo on DB Fiddle 产生:
| id | unique_id | reference_id | | --- | --------- | ------------ | | 45 | 45454 | 43 | | 66 | 55655 | 45 | | 78 | 88877 | 66 |
PS :请注意,这不是 return 最上面的父行。如果您也需要它,可以将 WHERE
条件更改为 :
where reference_id=@ref or unique_id = 55544
您可以使用递归 CTE。这是执行此操作的正确方法:
with recursive cte as (
select t.*
from table_name t
where t.unique_id = 55544
union all
select t.*
from cte join
table_name t
on cte.id = t.reference_id
)
select *
from cte;